Merge pull request #7709 from lajiyuan/main

Handle truncated chunks at the end of PNG images
This commit is contained in:
Andrew Murray 2024-03-01 22:25:28 +11:00 committed by GitHub
commit a20abff5e4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -783,6 +783,18 @@ class TestFilePng:
with Image.open(mystdout) as reloaded: with Image.open(mystdout) as reloaded:
assert_image_equal_tofile(reloaded, TEST_PNG_FILE) 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") @pytest.mark.skipif(is_win32(), reason="Requires Unix or macOS")
@skip_unless_feature("zlib") @skip_unless_feature("zlib")

View File

@ -981,7 +981,13 @@ class PngImageFile(ImageFile.ImageFile):
except EOFError: except EOFError:
if cid == b"fdAT": if cid == b"fdAT":
length -= 4 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: except AttributeError:
logger.debug("%r %s %s (unknown)", cid, pos, length) logger.debug("%r %s %s (unknown)", cid, pos, length)
s = ImageFile._safe_read(self.fp, length) s = ImageFile._safe_read(self.fp, length)