summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_plistlib.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-10-31 12:05:53 (GMT)
committerGitHub <noreply@github.com>2017-10-31 12:05:53 (GMT)
commitdb91e0fe2417f075693a194a492b1699829871e7 (patch)
tree10e3bacbd3cbf0c0c1b497ef57c8457eebfce424 /Lib/test/test_plistlib.py
parentb484d5606ca76f9bbd0f5de7a6ef753400213e94 (diff)
downloadcpython-db91e0fe2417f075693a194a492b1699829871e7.zip
cpython-db91e0fe2417f075693a194a492b1699829871e7.tar.gz
cpython-db91e0fe2417f075693a194a492b1699829871e7.tar.bz2
bpo-31897: Convert unexpected errors when read bogus binary plists into InvalidFileException. (#4171)
Diffstat (limited to 'Lib/test/test_plistlib.py')
-rw-r--r--Lib/test/test_plistlib.py68
1 files changed, 64 insertions, 4 deletions
diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py
index 58b885f..7dd179a 100644
--- a/Lib/test/test_plistlib.py
+++ b/Lib/test/test_plistlib.py
@@ -353,11 +353,13 @@ class TestPlistlib(unittest.TestCase):
testString = "string containing %s" % c
if i >= 32 or c in "\r\n\t":
# \r, \n and \t are the only legal control chars in XML
- plistlib.dumps(testString, fmt=plistlib.FMT_XML)
+ data = plistlib.dumps(testString, fmt=plistlib.FMT_XML)
+ if c != "\r":
+ self.assertEqual(plistlib.loads(data), testString)
else:
- self.assertRaises(ValueError,
- plistlib.dumps,
- testString)
+ with self.assertRaises(ValueError):
+ plistlib.dumps(testString, fmt=plistlib.FMT_XML)
+ plistlib.dumps(testString, fmt=plistlib.FMT_BINARY)
def test_non_bmp_characters(self):
pl = {'python': '\U0001f40d'}
@@ -366,6 +368,14 @@ class TestPlistlib(unittest.TestCase):
data = plistlib.dumps(pl, fmt=fmt)
self.assertEqual(plistlib.loads(data), pl)
+ def test_lone_surrogates(self):
+ for fmt in ALL_FORMATS:
+ with self.subTest(fmt=fmt):
+ with self.assertRaises(UnicodeEncodeError):
+ plistlib.dumps('\ud8ff', fmt=fmt)
+ with self.assertRaises(UnicodeEncodeError):
+ plistlib.dumps('\udcff', fmt=fmt)
+
def test_nondictroot(self):
for fmt in ALL_FORMATS:
with self.subTest(fmt=fmt):
@@ -442,6 +452,56 @@ class TestPlistlib(unittest.TestCase):
data = plistlib.dumps(d, fmt=plistlib.FMT_BINARY)
self.assertEqual(plistlib.loads(data), d)
+ def test_invalid_binary(self):
+ for data in [
+ # too short data
+ b'',
+ # too large offset_table_offset and nonstandard offset_size
+ b'\x00\x08'
+ b'\x00\x00\x00\x00\x00\x00\x03\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x2a',
+ # integer overflow in offset_table_offset
+ b'\x00\x08'
+ b'\x00\x00\x00\x00\x00\x00\x01\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\xff\xff\xff\xff\xff\xff\xff\xff',
+ # offset_size = 0
+ b'\x00\x08'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x09',
+ # ref_size = 0
+ b'\xa1\x01\x00\x08\x0a'
+ b'\x00\x00\x00\x00\x00\x00\x01\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x02'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x0b',
+ # integer overflow in offset
+ b'\x00\xff\xff\xff\xff\xff\xff\xff\xff'
+ b'\x00\x00\x00\x00\x00\x00\x08\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x09',
+ # invalid ASCII
+ b'\x51\xff\x08'
+ b'\x00\x00\x00\x00\x00\x00\x01\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x0a',
+ # invalid UTF-16
+ b'\x61\xd8\x00\x08'
+ b'\x00\x00\x00\x00\x00\x00\x01\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x01'
+ b'\x00\x00\x00\x00\x00\x00\x00\x00'
+ b'\x00\x00\x00\x00\x00\x00\x00\x0b',
+ ]:
+ with self.assertRaises(plistlib.InvalidFileException):
+ plistlib.loads(b'bplist00' + data, fmt=plistlib.FMT_BINARY)
+
class TestPlistlibDeprecated(unittest.TestCase):
def test_io_deprecated(self):