From 6bd3ed439a2f7f542df52c39211ae37a48b75238 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 4 Aug 2023 23:54:05 +1000 Subject: [PATCH 1/2] Ignore IPTC field that is only zero bytes --- Tests/test_file_iptc.py | 13 +++++++++++++ src/PIL/IptcImagePlugin.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index 2d99528d3..1e5f2d325 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -30,6 +30,19 @@ def test_getiptcinfo_jpg_found(): assert iptc[(2, 101)] == b"Hungary" +def test_getiptcinfo_zero_padding(): + # Arrange + with Image.open(TEST_FILE) as im: + im.info["photoshop"][0x0404] += b"\x00\x00\x00" + + # Act + iptc = IptcImagePlugin.getiptcinfo(im) + + # Assert + assert isinstance(iptc, dict) + assert len(iptc) == 3 + + def test_getiptcinfo_tiff_none(): # Arrange with Image.open("Tests/images/hopper.tif") as im: diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 6ce4975c0..1616395de 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -58,7 +58,7 @@ class IptcImageFile(ImageFile.ImageFile): # # get a IPTC field header s = self.fp.read(5) - if not len(s): + if not s.strip(b"\x00"): return None, 0 tag = s[1], s[2] From b37ca350a860f2e8f9c81b6c0ea83ee6e5c067ba Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 22 Aug 2023 10:13:41 +1000 Subject: [PATCH 2/2] Allow FotoStation tags --- Tests/test_file_iptc.py | 19 ++++++++++++++++++- src/PIL/IptcImagePlugin.py | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_iptc.py b/Tests/test_file_iptc.py index 1e5f2d325..d2edcfc27 100644 --- a/Tests/test_file_iptc.py +++ b/Tests/test_file_iptc.py @@ -1,5 +1,5 @@ import sys -from io import StringIO +from io import BytesIO, StringIO from PIL import Image, IptcImagePlugin @@ -30,6 +30,23 @@ def test_getiptcinfo_jpg_found(): assert iptc[(2, 101)] == b"Hungary" +def test_getiptcinfo_fotostation(): + # Arrange + with open(TEST_FILE, "rb") as fp: + data = bytearray(fp.read()) + data[86] = 240 + f = BytesIO(data) + with Image.open(f) as im: + # Act + iptc = IptcImagePlugin.getiptcinfo(im) + + # Assert + for tag in iptc.keys(): + if tag[0] == 240: + return + assert False, "FotoStation tag not found" + + def test_getiptcinfo_zero_padding(): # Arrange with Image.open(TEST_FILE) as im: diff --git a/src/PIL/IptcImagePlugin.py b/src/PIL/IptcImagePlugin.py index 1616395de..316cd17c7 100644 --- a/src/PIL/IptcImagePlugin.py +++ b/src/PIL/IptcImagePlugin.py @@ -64,7 +64,7 @@ class IptcImageFile(ImageFile.ImageFile): tag = s[1], s[2] # syntax - if s[0] != 0x1C or tag[0] < 1 or tag[0] > 9: + if s[0] != 0x1C or tag[0] not in [1, 2, 3, 4, 5, 6, 7, 8, 9, 240]: msg = "invalid IPTC/NAA file" raise SyntaxError(msg)