Issue #20538: UTF-7 incremental decoder produced inconsistant string when

input was truncated in BASE64 section.
This commit is contained in:
Serhiy Storchaka 2014-02-08 14:06:33 +02:00
commit 6cbf151032
3 changed files with 45 additions and 9 deletions

View File

@ -124,8 +124,6 @@ class ReadTest(MixInCheckStateHandling):
"".join(codecs.iterdecode([bytes([c]) for c in encoded], self.encoding))
)
# Temporary skip, see http://bugs.python.org/issue20542
@unittest.skip
def test_readline(self):
def getreader(input):
stream = io.BytesIO(input.encode(self.encoding))
@ -899,13 +897,40 @@ class UTF7Test(ReadTest, unittest.TestCase):
def test_partial(self):
self.check_partial(
"a+-b",
'a+-b\x00c\x80d\u0100e\U00010000f',
[
"a",
"a",
"a+",
"a+-",
"a+-b",
'a',
'a',
'a+',
'a+-',
'a+-b',
'a+-b',
'a+-b',
'a+-b',
'a+-b',
'a+-b\x00',
'a+-b\x00c',
'a+-b\x00c',
'a+-b\x00c',
'a+-b\x00c',
'a+-b\x00c',
'a+-b\x00c\x80',
'a+-b\x00c\x80d',
'a+-b\x00c\x80d',
'a+-b\x00c\x80d',
'a+-b\x00c\x80d',
'a+-b\x00c\x80d',
'a+-b\x00c\x80d\u0100',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e',
'a+-b\x00c\x80d\u0100e\U00010000',
'a+-b\x00c\x80d\u0100e\U00010000f',
]
)

View File

@ -10,6 +10,9 @@ Release date: 2014-02-09
Core and Builtins
-----------------
- Issue #20538: UTF-7 incremental decoder produced inconsistant string when
input was truncated in BASE64 section.
- Issue #20404: io.TextIOWrapper (and hence the open() builtin) now uses the
internal codec marking system added for issue #19619 to throw LookupError
for known non-text encodings at stream construction time. The existing

View File

@ -4459,8 +4459,16 @@ utf7Error:
/* return state */
if (consumed) {
if (inShift) {
writer.pos = shiftOutStart; /* back off output */
*consumed = startinpos;
if (writer.pos != shiftOutStart && writer.maxchar > 127) {
PyObject *result = PyUnicode_FromKindAndData(
writer.kind, writer.data, shiftOutStart);
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
_PyUnicodeWriter_Dealloc(&writer);
return result;
}
writer.pos = shiftOutStart; /* back off output */
}
else {
*consumed = s-starts;