diff --git a/PIL/Jpeg2KImagePlugin.py b/PIL/Jpeg2KImagePlugin.py index b82acdd98..238500448 100644 --- a/PIL/Jpeg2KImagePlugin.py +++ b/PIL/Jpeg2KImagePlugin.py @@ -84,7 +84,8 @@ def _parse_jp2_header(fp): size = None mode = None bpc = None - + nc = None + hio = io.BytesIO(header) while True: lbox, tbox = struct.unpack('>I4s', hio.read(8)) @@ -141,6 +142,9 @@ def _parse_jp2_header(fp): mode = 'RGBA' break + if size is None or mode is None: + raise SyntaxError("Malformed jp2 header") + return (size, mode) ## diff --git a/Tests/images/unbound_variable.jp2 b/Tests/images/unbound_variable.jp2 new file mode 100644 index 000000000..ed6d5943e Binary files /dev/null and b/Tests/images/unbound_variable.jp2 differ diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 4b7286a20..7e23e091a 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -170,6 +170,18 @@ class TestFileJpeg2k(PillowTestCase): im = self.roundtrip(jp2) self.assert_image_equal(im, jp2) + def test_unbound_local(self): + # prepatch, a malformed jp2 file could cause an UnboundLocalError + # exception. + try: + jp2 = Image.open('Tests/images/unbound_variable.jp2') + self.assertTrue(False, 'Expecting an exception') + except SyntaxError as err: + self.assertTrue(True, 'Expecting a syntax error') + except IOError as err: + self.assertTrue(True, 'Expecting an IO error') + except UnboundLocalError as err: + self.assertTrue(False, "Prepatch error") if __name__ == '__main__': unittest.main()