diff --git a/PIL/ImageFile.py b/PIL/ImageFile.py index 597e41783..da86e1155 100644 --- a/PIL/ImageFile.py +++ b/PIL/ImageFile.py @@ -190,9 +190,6 @@ class ImageFile(Image.Image): except AttributeError: prefix = b"" - # Buffer length read; assign a default value - t = 0 - for d, e, o, a in self.tile: d = Image._getdecoder(self.mode, d, a, self.decoderconfig) seek(o) @@ -201,7 +198,6 @@ class ImageFile(Image.Image): except ValueError: continue b = prefix - t = len(b) while True: try: s = read(self.decodermaxblock) @@ -230,7 +226,6 @@ class ImageFile(Image.Image): if n < 0: break b = b[n:] - t = t + n # Need to cleanup here to prevent leaks in PyPy d.cleanup() @@ -239,7 +234,7 @@ class ImageFile(Image.Image): self.fp = None # might be shared - if not self.map and (not LOAD_TRUNCATED_IMAGES or t == 0) and e < 0: + if not self.map and not LOAD_TRUNCATED_IMAGES and e < 0: # still raised if decoder fails to return anything raise_ioerror(e) diff --git a/Tests/images/broken_data_stream.png b/Tests/images/broken_data_stream.png new file mode 100644 index 000000000..ccf310b2f Binary files /dev/null and b/Tests/images/broken_data_stream.png differ diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py index 857df1441..5705180ff 100644 --- a/Tests/test_imagefile.py +++ b/Tests/test_imagefile.py @@ -115,6 +115,26 @@ class TestImageFile(PillowTestCase): finally: ImageFile.LOAD_TRUNCATED_IMAGES = False + def test_broken_datastream_with_errors(self): + if "zip_encoder" not in codecs: + self.skipTest("PNG (zlib) encoder not available") + + im = Image.open("Tests/images/broken_data_stream.png") + with self.assertRaises(IOError): + im.load() + + def test_broken_datastream_without_errors(self): + if "zip_encoder" not in codecs: + self.skipTest("PNG (zlib) encoder not available") + + im = Image.open("Tests/images/broken_data_stream.png") + + ImageFile.LOAD_TRUNCATED_IMAGES = True + try: + im.load() + finally: + ImageFile.LOAD_TRUNCATED_IMAGES = False + if __name__ == '__main__': unittest.main()