summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-07-16 20:17:31 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-07-16 20:17:31 (GMT)
commit579db160b392404b6dd9608ce5f5bef29a9885a4 (patch)
tree453ae087910ea944efe5eed000d99c5d277e4cbe
parentb37f43f94b693468d8b3b9dfc84b1930c52a1b61 (diff)
downloadcpython-579db160b392404b6dd9608ce5f5bef29a9885a4.zip
cpython-579db160b392404b6dd9608ce5f5bef29a9885a4.tar.gz
cpython-579db160b392404b6dd9608ce5f5bef29a9885a4.tar.bz2
Closes #23247: Fix a crash in the StreamWriter.reset() of CJK codecs
-rw-r--r--Lib/test/multibytecodec_support.py7
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/cjkcodecs/multibytecodec.c3
3 files changed, 12 insertions, 0 deletions
diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py
index bc1cfc8..f9884c6 100644
--- a/Lib/test/multibytecodec_support.py
+++ b/Lib/test/multibytecodec_support.py
@@ -270,6 +270,13 @@ class TestBase:
self.assertEqual(ostream.getvalue(), self.tstring[0])
+ def test_streamwriter_reset_no_pending(self):
+ # Issue #23247: Calling reset() on a fresh StreamWriter instance
+ # (without pending data) must not crash
+ stream = BytesIO()
+ writer = self.writer(stream)
+ writer.reset()
+
class TestBase_Mapping(unittest.TestCase):
pass_enctest = []
diff --git a/Misc/NEWS b/Misc/NEWS
index 874bbd9..c0a5edf 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -66,6 +66,8 @@ Core and Builtins
Library
-------
+- Issue #23247: Fix a crash in the StreamWriter.reset() of CJK codecs.
+
- Issue #18622: unittest.mock.mock_open().reset_mock would recurse infinitely.
Patch from Nicola Palumbo and Laurent De Buyst.
diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c
index 435529f..e0d9b67 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -1629,6 +1629,9 @@ mbstreamwriter_reset(MultibyteStreamWriterObject *self)
{
PyObject *pwrt;
+ if (!self->pending)
+ Py_RETURN_NONE;
+
pwrt = multibytecodec_encode(self->codec, &self->state,
self->pending, NULL, self->errors,
MBENC_FLUSH | MBENC_RESET);