From 329a879e13de6e61931ac85a51233caf103ccb5b Mon Sep 17 00:00:00 2001 From: Mikhail Iurkov Date: Wed, 19 Jan 2022 14:16:41 +0300 Subject: [PATCH] Skip tags with bad value pointers --- piexif/_load.py | 8 ++++++++ tests/images/r_bad_pointer.jpg | Bin 0 -> 3717 bytes tests/s_test.py | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 tests/images/r_bad_pointer.jpg diff --git a/piexif/_load.py b/piexif/_load.py index 31ad252..7645ce8 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 = struct.unpack(self.endian_mark + "H", self.tiftag[pointer: pointer+2])[0] diff --git a/tests/images/r_bad_pointer.jpg b/tests/images/r_bad_pointer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d12e0884080fc90fa68f15dcaea53950974f3d2 GIT binary patch literal 3717 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 I<2&#E0iZHZSO5S3 literal 0 HcmV?d00001 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)