Skip to content

gh-139423: Fix plistlib to preserve carriage returns in XML plist round-trips#148305

Open
gaweng wants to merge 1 commit intopython:mainfrom
gaweng:fix-plistlib-cr-roundtrip
Open

gh-139423: Fix plistlib to preserve carriage returns in XML plist round-trips#148305
gaweng wants to merge 1 commit intopython:mainfrom
gaweng:fix-plistlib-cr-roundtrip

Conversation

@gaweng
Copy link
Copy Markdown
Contributor

@gaweng gaweng commented Apr 9, 2026

plistlib's _escape() function was normalizing \r\n to \n and \r to \n during XML plist serialization. When the plist was loaded back, the original carriage return characters were lost because expat also normalizes newlines in XML character data.

Fix by encoding \r as the XML character reference instead of converting it to \n. Character references are not subject to XML newline normalization, so expat correctly decodes back to \r, preserving the original data during round-trips.

…st round-trips

plistlib's _escape() function was normalizing \r\n to \n and \r to \n
during XML plist serialization. When the plist was loaded back, the
original carriage return characters were lost because expat also
normalizes newlines in XML character data.

Fix by encoding \r as the XML character reference &python#13; instead of
converting it to \n. Character references are not subject to XML
newline normalization, so expat correctly decodes &python#13; back to \r,
preserving the original data during round-trips.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant