diff --git a/Tests/test_file_mpo.py b/Tests/test_file_mpo.py index f105428ca82..f45032c7888 100644 --- a/Tests/test_file_mpo.py +++ b/Tests/test_file_mpo.py @@ -91,6 +91,18 @@ def test_exif(test_file: str) -> None: assert info[34665] == 188 +def test_app1_not_exif() -> None: + with open("Tests/images/sugarshack.mpo", "rb") as fp: + data = fp.read() + data = data[:60014] + b" " + data[60015:] + b = BytesIO(data) + with Image.open(b) as im: + del im.info["exif"] + + im.seek(1) + assert "exif" not in im.info + + def test_frame_size() -> None: # This image has been hexedited to contain a different size # in the EXIF data of the second frame diff --git a/src/PIL/MpoImagePlugin.py b/src/PIL/MpoImagePlugin.py index 199a100904c..9dd931d2a26 100644 --- a/src/PIL/MpoImagePlugin.py +++ b/src/PIL/MpoImagePlugin.py @@ -145,14 +145,16 @@ def seek(self, frame): self._size = self._initial_size if i16(segment) == 0xFFE1: # APP1 n = i16(self.fp.read(2)) - 2 - self.info["exif"] = ImageFile._safe_read(self.fp, n) - self._reload_exif() - - mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"] - if mptype.startswith("Large Thumbnail"): - exif = self.getexif().get_ifd(ExifTags.IFD.Exif) - if 40962 in exif and 40963 in exif: - self._size = (exif[40962], exif[40963]) + s = ImageFile._safe_read(self.fp, n) + if s[:6] == b"Exif\0\0": + self.info["exif"] = s + self._reload_exif() + + mptype = self.mpinfo[0xB002][frame]["Attribute"]["MPType"] + if mptype.startswith("Large Thumbnail"): + exif = self.getexif().get_ifd(ExifTags.IFD.Exif) + if 40962 in exif and 40963 in exif: + self._size = (exif[40962], exif[40963]) elif "exif" in self.info: del self.info["exif"] self._reload_exif()