Skip to content

Commit

Permalink
Merge pull request #7709 from lajiyuan/main
Browse files Browse the repository at this point in the history
Handle truncated chunks at the end of PNG images
  • Loading branch information
radarhere committed Mar 1, 2024
2 parents 1f60243 + 58554de commit a20abff
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
Binary file added Tests/images/truncated_end_chunk.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions Tests/test_file_png.py
Expand Up @@ -783,6 +783,18 @@ class MyStdOut:
with Image.open(mystdout) as reloaded:
assert_image_equal_tofile(reloaded, TEST_PNG_FILE)

def test_truncated_end_chunk(self) -> None:
with Image.open("Tests/images/truncated_end_chunk.png") as im:
with pytest.raises(OSError):
im.load()

ImageFile.LOAD_TRUNCATED_IMAGES = True
try:
with Image.open("Tests/images/truncated_end_chunk.png") as im:
assert_image_equal_tofile(im, "Tests/images/hopper.png")
finally:
ImageFile.LOAD_TRUNCATED_IMAGES = False


@pytest.mark.skipif(is_win32(), reason="Requires Unix or macOS")
@skip_unless_feature("zlib")
Expand Down
8 changes: 7 additions & 1 deletion src/PIL/PngImagePlugin.py
Expand Up @@ -981,7 +981,13 @@ def load_end(self):
except EOFError:
if cid == b"fdAT":
length -= 4
ImageFile._safe_read(self.fp, length)
try:
ImageFile._safe_read(self.fp, length)
except OSError as e:
if ImageFile.LOAD_TRUNCATED_IMAGES:
break
else:
raise e
except AttributeError:
logger.debug("%r %s %s (unknown)", cid, pos, length)
s = ImageFile._safe_read(self.fp, length)
Expand Down

0 comments on commit a20abff

Please sign in to comment.