From ff34e1b548c77dda03dc2436d62811870329467b 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 902e8ce5ff6..5a3a684c271 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -61,15 +61,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): @@ -542,8 +546,7 @@ def _encode_tile(im, fp, 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()