Skip to content

Commit a8a5c58

Browse files
(3.3->default) Ensure that plistlib doesn't corrupt deeply nested datastructures
Without this changeset plistlib would write empty tags for plistlib.Data objects in deeply nested datastructures. Fixes #17353
2 parents cbe19e5 + 326edfd commit a8a5c58

3 files changed

Lines changed: 16 additions & 2 deletions

File tree

Lib/plistlib.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,8 @@ def writeValue(self, value):
228228
def writeData(self, data):
229229
self.beginElement("data")
230230
self.indentLevel -= 1
231-
maxlinelength = 76 - len(self.indent.replace(b"\t", b" " * 8) *
232-
self.indentLevel)
231+
maxlinelength = max(16, 76 - len(self.indent.replace(b"\t", b" " * 8) *
232+
self.indentLevel))
233233
for line in data.asBase64(maxlinelength).split(b"\n"):
234234
if line:
235235
self.writeln(line)

Lib/test/test_plistlib.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,18 @@ def test_bytes(self):
141141
data2 = plistlib.writePlistToBytes(pl2)
142142
self.assertEqual(data, data2)
143143

144+
def test_indentation_array(self):
145+
data = [[[[[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]]]]
146+
self.assertEqual(plistlib.readPlistFromBytes(plistlib.writePlistToBytes(data)), data)
147+
148+
def test_indentation_dict(self):
149+
data = {'1': {'2': {'3': {'4': {'5': {'6': {'7': {'8': {'9': plistlib.Data(b'aaaaaa')}}}}}}}}}
150+
self.assertEqual(plistlib.readPlistFromBytes(plistlib.writePlistToBytes(data)), data)
151+
152+
def test_indentation_dict_mix(self):
153+
data = {'1': {'2': [{'3': [[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]}]}}
154+
self.assertEqual(plistlib.readPlistFromBytes(plistlib.writePlistToBytes(data)), data)
155+
144156
def test_appleformatting(self):
145157
pl = plistlib.readPlistFromBytes(TESTDATA)
146158
data = plistlib.writePlistToBytes(pl)

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Core and Builtins
4949
Library
5050
-------
5151

52+
- Issue #17353: Plistlib emitted empty data tags with deeply nested datastructures
53+
5254
- Issue #11714: Use 'with' statements to assure a Semaphore releases a
5355
condition variable. Original patch by Thomas Rachel.
5456

0 commit comments

Comments
 (0)