diff options
author | Hye-Shik Chang <hyeshik@gmail.com> | 2007-06-05 18:58:51 (GMT) |
---|---|---|
committer | Hye-Shik Chang <hyeshik@gmail.com> | 2007-06-05 18:58:51 (GMT) |
commit | 9b5414090b8cdd7fb086578003398066585a42c7 (patch) | |
tree | b0d831e90bd53dfed625b02efa3df27380f9b716 | |
parent | 82958f0d3b503d7fc448377993e6884f7c51157e (diff) | |
download | cpython-9b5414090b8cdd7fb086578003398066585a42c7.zip cpython-9b5414090b8cdd7fb086578003398066585a42c7.tar.gz cpython-9b5414090b8cdd7fb086578003398066585a42c7.tar.bz2 |
Bug #1728403: Fix a bug that CJKCodecs StreamReader hangs when it
reads a file that ends with incomplete sequence and sizehint argument
for .read() is specified.
-rw-r--r-- | Lib/test/test_multibytecodec.py | 10 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Modules/cjkcodecs/multibytecodec.c | 6 |
3 files changed, 18 insertions, 2 deletions
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py index de27339..b6557f3 100644 --- a/Lib/test/test_multibytecodec.py +++ b/Lib/test/test_multibytecodec.py @@ -136,11 +136,19 @@ class Test_IncrementalDecoder(unittest.TestCase): self.assertRaises(UnicodeDecodeError, decoder.decode, '', True) self.assertEqual(decoder.decode('B@$'), u'\u4e16') +class Test_StreamReader(unittest.TestCase): + def test_bug1728403(self): + try: + open(TESTFN, 'w').write('\xa1') + f = codecs.open(TESTFN, encoding='cp949') + self.assertRaises(UnicodeDecodeError, f.read, 2) + finally: + os.unlink(TESTFN) class Test_StreamWriter(unittest.TestCase): if len(u'\U00012345') == 2: # UCS2 def test_gb18030(self): - s= StringIO.StringIO() + s = StringIO.StringIO() c = codecs.getwriter('gb18030')(s) c.write(u'123') self.assertEqual(s.getvalue(), '123') @@ -222,6 +222,10 @@ Core and builtins Library ------- +- Bug #1728403: Fix a bug that CJKCodecs StreamReader hangs when it + reads a file that ends with incomplete sequence and sizehint argument + for .read() is specified. + - Bug #1730389: Change time.strptime() to use ``\s+`` instead of ``\s*`` when matching spaces in the specified format argument. diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 7c6b989..9fb9570 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1214,6 +1214,8 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, cres = NULL; for (;;) { + int endoffile; + if (sizehint < 0) cres = PyObject_CallMethod(self->stream, (char *)method, NULL); @@ -1230,6 +1232,8 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, goto errorexit; } + endoffile = (PyString_GET_SIZE(cres) == 0); + if (self->pendingsize > 0) { PyObject *ctr; char *ctrdata; @@ -1257,7 +1261,7 @@ mbstreamreader_iread(MultibyteStreamReaderObject *self, (MultibyteStatefulDecoderContext *)self, &buf)) goto errorexit; - if (rsize == 0 || sizehint < 0) { /* end of file */ + if (endoffile || sizehint < 0) { if (buf.inbuf < buf.inbuf_end && multibytecodec_decerror(self->codec, &self->state, &buf, self->errors, MBERR_TOOFEW)) |