From: Serhiy Storchaka Date: Tue, 4 Oct 2016 17:04:30 +0000 (+0300) Subject: Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. X-Git-Tag: v3.6.0b2~54^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7338ebc4ba00366fa2c4f592630c2acd98c178d8;p=python Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. --- diff --git a/Lib/plistlib.py b/Lib/plistlib.py index b66639ca9e..2502b39c7c 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -918,7 +918,7 @@ class _BinaryPlistWriter (object): self._write_size(0x50, len(value)) except UnicodeEncodeError: t = value.encode('utf-16be') - self._write_size(0x60, len(value)) + self._write_size(0x60, len(t) // 2) self._fp.write(t) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index 16114f9f6f..692cac4bdf 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -361,6 +361,13 @@ class TestPlistlib(unittest.TestCase): plistlib.dumps, testString) + def test_non_bmp_characters(self): + pl = {'python': '\U0001f40d'} + for fmt in ALL_FORMATS: + with self.subTest(fmt=fmt): + data = plistlib.dumps(pl, fmt=fmt) + self.assertEqual(plistlib.loads(data), pl) + def test_nondictroot(self): for fmt in ALL_FORMATS: with self.subTest(fmt=fmt): diff --git a/Misc/NEWS b/Misc/NEWS index 8816ea9ead..ef9ba7fdd8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -89,6 +89,8 @@ Core and Builtins Library ------- +- Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. + - Issue #28322: Fixed possible crashes when unpickle itertools objects from incorrect pickle data. Based on patch by John Leitch.