From 5426d7b8c7e775213ef35ce6527d74ef145c376a Mon Sep 17 00:00:00 2001 From: Benjamin Gilbert Date: Mon, 4 Dec 2023 07:49:08 -0600 Subject: [PATCH] Translate encoder error codes to strings When decoding, we use raise_oserror() to convert codec error codes to strings. Adapt that code to be used when encoding as well. Add a new helper function that returns the exception so we can still raise `from exc`. Ideally we'd replace the other two callers of raise_oserror() with `raise _get_oserror()`, but the former is part of the public API. --- src/PIL/ImageFile.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 8bca19a4b8d..54fe068312a 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -63,15 +63,19 @@ # Helpers -def raise_oserror(error): +def _get_oserror(error, *, encoder=False): try: msg = Image.core.getcodecstatus(error) except AttributeError: msg = ERRORS.get(error) if not msg: - msg = f"decoder error {error}" - msg += " when reading image file" - raise OSError(msg) + msg = f"{'encoder' if encoder else 'decoder'} error {error}" + msg += f" when {'writing' if encoder else 'reading'} image file" + return OSError(msg) + + +def raise_oserror(error): + raise _get_oserror(error) def _tilesort(t): @@ -551,8 +555,7 @@ def _encode_tile(im, fp, tile: list[_Tile], bufsize, fh, exc=None): # slight speedup: compress to real file object errcode = encoder.encode_to_file(fh, bufsize) if errcode < 0: - msg = f"encoder error {errcode} when writing image file" - raise OSError(msg) from exc + raise _get_oserror(errcode, encoder=True) from exc finally: encoder.cleanup()