[Python-checkins] cpython (2.7): Ensure that plistlib doesn't corrupt deeply nested datastructures
ronald.oussoren
python-checkins at python.org
Tue Apr 23 13:50:54 CEST 2013
http://hg.python.org/cpython/rev/a389700fbc74
changeset: 83505:a389700fbc74
branch: 2.7
parent: 83502:990c1bd26ef1
user: Ronald Oussoren <ronaldoussoren at mac.com>
date: Tue Apr 23 13:47:06 2013 +0200
summary:
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
files:
Lib/plistlib.py | 4 ++--
Lib/test/test_plistlib.py | 12 ++++++++++++
Misc/NEWS | 2 ++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/Lib/plistlib.py b/Lib/plistlib.py
--- a/Lib/plistlib.py
+++ b/Lib/plistlib.py
@@ -262,8 +262,8 @@
def writeData(self, data):
self.beginElement("data")
self.indentLevel -= 1
- maxlinelength = 76 - len(self.indent.replace("\t", " " * 8) *
- self.indentLevel)
+ maxlinelength = max(16, 76 - len(self.indent.replace("\t", " " * 8) *
+ self.indentLevel))
for line in data.asBase64(maxlinelength).split("\n"):
if line:
self.writeln(line)
diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py
--- a/Lib/test/test_plistlib.py
+++ b/Lib/test/test_plistlib.py
@@ -135,6 +135,18 @@
data2 = plistlib.writePlistToString(pl2)
self.assertEqual(data, data2)
+ def test_indentation_array(self):
+ data = [[[[[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]]]]
+ self.assertEqual(plistlib.readPlistFromString(plistlib.writePlistToString(data)), data)
+
+ def test_indentation_dict(self):
+ data = {'1': {'2': {'3': {'4': {'5': {'6': {'7': {'8': {'9': plistlib.Data(b'aaaaaa')}}}}}}}}}
+ self.assertEqual(plistlib.readPlistFromString(plistlib.writePlistToString(data)), data)
+
+ def test_indentation_dict_mix(self):
+ data = {'1': {'2': [{'3': [[[[[{'test': plistlib.Data(b'aaaaaa')}]]]]]}]}}
+ self.assertEqual(plistlib.readPlistFromString(plistlib.writePlistToString(data)), data)
+
def test_appleformatting(self):
pl = plistlib.readPlistFromString(TESTDATA)
data = plistlib.writePlistToString(pl)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -28,6 +28,8 @@
Library
-------
+- Issue #17353: Plistlib emitted empty data tags with deeply nested datastructures
+
- Issue #11714: Use 'with' statements to assure a Semaphore releases a
condition variable. Original patch by Thomas Rachel.
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list