diff --git a/piexif/_load.py b/piexif/_load.py index da91426..aa820c4 100644 --- a/piexif/_load.py +++ b/piexif/_load.py @@ -104,6 +104,14 @@ def __init__(self, data): raise InvalidImageDataError("Given file is neither JPEG nor TIFF.") def get_ifd_dict(self, pointer, ifd_name, read_unknown=False): + try: + result = self._do_get_ifd_dict(pointer, ifd_name, read_unknown) + except struct.error: + # Bad pointers will appear as `struct.error` + result = {} + return result + + def _do_get_ifd_dict(self, pointer, ifd_name, read_unknown=False): ifd_dict = {} tag_count = unpack_from(self.endian_mark + "H", self.tiftag, pointer)[0] diff --git a/tests/images/r_bad_pointer.jpg b/tests/images/r_bad_pointer.jpg new file mode 100644 index 0000000..5d12e08 Binary files /dev/null and b/tests/images/r_bad_pointer.jpg differ diff --git a/tests/s_test.py b/tests/s_test.py index 5d105de..042df90 100644 --- a/tests/s_test.py +++ b/tests/s_test.py @@ -424,7 +424,9 @@ def test_roundtrip_files(self): if ifd == "0th": if ImageIFD.ExifTag in exif["0th"]: exif["0th"].pop(ImageIFD.ExifTag) - e["0th"].pop(ImageIFD.ExifTag) + # In case of invalid pointer, PIL uses + # pointer value as tag value, rather than skip it + e["0th"].pop(ImageIFD.ExifTag, None) if ImageIFD.GPSTag in exif["0th"]: exif["0th"].pop(ImageIFD.GPSTag) e["0th"].pop(ImageIFD.GPSTag)