(b'a+////,+IKw-b', 'a\uffff\ufffd\u20acb'),
(b'a+IKw-b\xff', 'a\u20acb\ufffd'),
(b'a+IKw\xffb', 'a\u20ac\ufffdb'),
+ (b'a+@b', 'a\ufffdb'),
]
for raw, expected in tests:
with self.subTest(raw=raw):
for c in set_o:
self.assertEqual(c.encode('ascii').decode('utf7'), c)
+ with self.assertRaisesRegex(UnicodeDecodeError,
+ 'ill-formed sequence'):
+ b'+@'.decode('utf-7')
+
def test_codecs_utf8(self):
self.assertEqual(''.encode('utf-8'), b'')
self.assertEqual('\u20ac'.encode('utf-8'), b'\xe2\x82\xac')
--- /dev/null
+The UTF-7 decoder now raises :exc:`UnicodeDecodeError` for ill-formed
+sequences starting with "+" (as specified in RFC 2152). Patch by Zackery
+Spytz.
if (_PyUnicodeWriter_WriteCharInline(&writer, '+') < 0)
goto onError;
}
+ else if (s < e && !IS_BASE64(*s)) {
+ s++;
+ errmsg = "ill-formed sequence";
+ goto utf7Error;
+ }
else { /* begin base64-encoded section */
inShift = 1;
surrogate = 0;