From e51be505492f95df4306f5a918f4900ae8da6d78 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sat, 30 Nov 2019 10:08:32 +1100 Subject: [PATCH] Handle broken Photoshop data --- Tests/images/photoshop-200dpi-broken.jpg | Bin 0 -> 10953 bytes Tests/test_file_jpeg.py | 5 +++++ src/PIL/JpegImagePlugin.py | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Tests/images/photoshop-200dpi-broken.jpg diff --git a/Tests/images/photoshop-200dpi-broken.jpg b/Tests/images/photoshop-200dpi-broken.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a574872f267caea4bb2c0b185990f01a473f84de GIT binary patch literal 10953 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 literal 0 HcmV?d00001 diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 35f2c0940..04851d82c 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -656,6 +656,11 @@ class TestFileJpeg(PillowTestCase): }, ) + # Test that the image can still load, even with broken Photoshop data + # This image had the APP13 length hexedited to be smaller + with Image.open("Tests/images/photoshop-200dpi-broken.jpg") as im_broken: + self.assert_image_equal(im_broken, im) + # This image does not contain a Photoshop header string with Image.open("Tests/images/app13.jpg") as im: self.assertNotIn("photoshop", im.info) diff --git a/src/PIL/JpegImagePlugin.py b/src/PIL/JpegImagePlugin.py index ea2f795a7..4286e1ae7 100644 --- a/src/PIL/JpegImagePlugin.py +++ b/src/PIL/JpegImagePlugin.py @@ -109,7 +109,10 @@ def APP(self, marker): while blocks[offset : offset + 4] == b"8BIM": offset += 4 # resource code - code = i16(blocks, offset) + try: + code = i16(blocks, offset) + except struct.error: + break offset += 2 # resource name (usually empty) name_len = i8(blocks[offset])