diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2017-10-31 13:58:55 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2017-10-31 13:58:55 (GMT) |
commit | 6969d368c43d4c97e5f7b7b22904305ec68f79ba (patch) | |
tree | 9cb792f1ed535c58b471d10c449b10e2bcb12414 /Lib/test | |
parent | ece5659565e083baaee4d185ce181a98aaee7f96 (diff) | |
download | cpython-6969d368c43d4c97e5f7b7b22904305ec68f79ba.zip cpython-6969d368c43d4c97e5f7b7b22904305ec68f79ba.tar.gz cpython-6969d368c43d4c97e5f7b7b22904305ec68f79ba.tar.bz2 |
bpo-31897: Convert unexpected errors when read bogus binary plists into InvalidFileException. (GH-4171) (#4192)
(cherry picked from commit db91e0fe2417f075693a194a492b1699829871e7)
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/test_plistlib.py | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index c77a6bf..4c9ba4c 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -354,11 +354,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'} @@ -367,6 +369,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): @@ -443,6 +453,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): |