Skip to content

Commit 6a44854

Browse files
authored
Merge pull request #8171 from radarhere/xmp
2 parents a90a9d5 + fd3f6c1 commit 6a44854

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

Tests/test_image.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import tempfile
99
import warnings
1010
from pathlib import Path
11+
from types import ModuleType
1112
from typing import IO, Any
1213

1314
import pytest
@@ -35,6 +36,12 @@
3536
skip_unless_feature,
3637
)
3738

39+
ElementTree: ModuleType | None
40+
try:
41+
from defusedxml import ElementTree
42+
except ImportError:
43+
ElementTree = None
44+
3845

3946
# Deprecation helper
4047
def helper_image_new(mode: str, size: tuple[int, int]) -> Image.Image:
@@ -921,6 +928,21 @@ def test_empty_xmp(self) -> None:
921928
with Image.open("Tests/images/hopper.gif") as im:
922929
assert im.getxmp() == {}
923930

931+
def test_getxmp_padded(self) -> None:
932+
im = Image.new("RGB", (1, 1))
933+
im.info["xmp"] = (
934+
b'<?xpacket begin="\xef\xbb\xbf" id="W5M0MpCehiHzreSzNTczkc9d"?>\n'
935+
b'<x:xmpmeta xmlns:x="adobe:ns:meta/" />\n<?xpacket end="w"?>\x00\x00'
936+
)
937+
if ElementTree is None:
938+
with pytest.warns(
939+
UserWarning,
940+
match="XMP data cannot be read without defusedxml dependency",
941+
):
942+
assert im.getxmp() == {}
943+
else:
944+
assert im.getxmp() == {"xmpmeta": None}
945+
924946
@pytest.mark.parametrize("size", ((1, 0), (0, 1), (0, 0)))
925947
def test_zero_tobytes(self, size: tuple[int, int]) -> None:
926948
im = Image.new("RGB", size)

src/PIL/Image.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1511,7 +1511,7 @@ def get_value(element):
15111511
return {}
15121512
if "xmp" not in self.info:
15131513
return {}
1514-
root = ElementTree.fromstring(self.info["xmp"])
1514+
root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00"))
15151515
return {get_name(root.tag): get_value(root)}
15161516

15171517
def getexif(self) -> Exif:

src/PIL/JpegImagePlugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def APP(self, marker):
9696
self.info["exif"] = s
9797
self._exif_offset = self.fp.tell() - n + 6
9898
elif marker == 0xFFE1 and s[:29] == b"http://ns.adobe.com/xap/1.0/\x00":
99-
self.info["xmp"] = s.split(b"\x00")[1]
99+
self.info["xmp"] = s.split(b"\x00", 1)[1]
100100
elif marker == 0xFFE2 and s[:5] == b"FPXR\0":
101101
# extract FlashPix information (incomplete)
102102
self.info["flashpix"] = s # FIXME: value will change

0 commit comments

Comments
 (0)