cpython: 7dde9c553f16 (original) (raw)
--- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -820,6 +820,36 @@ class UTF7Test(ReadTest, unittest.TestCa ] )
- def test_errors(self):
tests = [[](#l1.8)
(b'a\xffb', 'a\ufffdb'),[](#l1.9)
(b'a+IK', 'a\ufffd'),[](#l1.10)
(b'a+IK-b', 'a\ufffdb'),[](#l1.11)
(b'a+IK,b', 'a\ufffdb'),[](#l1.12)
(b'a+IKx', 'a\u20ac\ufffd'),[](#l1.13)
(b'a+IKx-b', 'a\u20ac\ufffdb'),[](#l1.14)
(b'a+IKwgr', 'a\u20ac\ufffd'),[](#l1.15)
(b'a+IKwgr-b', 'a\u20ac\ufffdb'),[](#l1.16)
(b'a+IKwgr,', 'a\u20ac\ufffd'),[](#l1.17)
(b'a+IKwgr,-b', 'a\u20ac\ufffd-b'),[](#l1.18)
(b'a+IKwgrB', 'a\u20ac\u20ac\ufffd'),[](#l1.19)
(b'a+IKwgrB-b', 'a\u20ac\u20ac\ufffdb'),[](#l1.20)
(b'a+/,+IKw-b', 'a\ufffd\u20acb'),[](#l1.21)
(b'a+//,+IKw-b', 'a\ufffd\u20acb'),[](#l1.22)
(b'a+///,+IKw-b', 'a\uffff\ufffd\u20acb'),[](#l1.23)
(b'a+////,+IKw-b', 'a\uffff\ufffd\u20acb'),[](#l1.24)
][](#l1.25)
for raw, expected in tests:[](#l1.26)
with self.subTest(raw=raw):[](#l1.27)
self.assertRaises(UnicodeDecodeError, codecs.utf_7_decode,[](#l1.28)
raw, 'strict', True)[](#l1.29)
self.assertEqual(raw.decode('utf-7', 'replace'), expected)[](#l1.30)
- def test_nonbmp(self):
self.assertEqual('\U000104A0'.encode(self.encoding), b'+2AHcoA-')[](#l1.33)
self.assertEqual('\ud801\udca0'.encode(self.encoding), b'+2AHcoA-')[](#l1.34)
self.assertEqual(b'+2AHcoA-'.decode(self.encoding), '\U000104A0')[](#l1.35)
+ class UTF16ExTest(unittest.TestCase): def test_errors(self):
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Projected release date: 2013-10-20 Core and Builtins ----------------- +- Issue #19279: UTF-7 decoder no more produces illegal strings. +
- Issue #16612: Add "Argument Clinic", a compile-time preprocessor for C files to generate argument parsing code. (See PEP 436.)
--- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4341,6 +4341,7 @@ PyUnicode_DecodeUTF7Stateful(const char Py_UCS4 outCh = (Py_UCS4)(base64buffer >> (base64bits-16)); base64bits -= 16; base64buffer &= (1 << base64bits) - 1; /* clear high bits */
assert(outCh <= 0xffff);[](#l3.7) if (surrogate) {[](#l3.8) /* expecting a second surrogate */[](#l3.9) if (Py_UNICODE_IS_LOW_SURROGATE(outCh)) {[](#l3.10)
@@ -4408,6 +4409,7 @@ PyUnicode_DecodeUTF7Stateful(const char inShift = 1; shiftOutStart = writer.pos; base64bits = 0;
base64buffer = 0;[](#l3.15) }[](#l3.16) }[](#l3.17) else if (DECODE_DIRECT(ch)) { /* character decodes as itself */[](#l3.18)