summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_StringIO.py7
-rw-r--r--Misc/ACKS1
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/cStringIO.c22
4 files changed, 26 insertions, 7 deletions
diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py
index e74a427..c61f7cc 100644
--- a/Lib/test/test_StringIO.py
+++ b/Lib/test/test_StringIO.py
@@ -44,6 +44,13 @@ class TestGenericStringIO(unittest.TestCase):
f.seek(0)
self.assertEqual(f.getvalue(), 'abc')
+ def test_writelines_error(self):
+ def errorGen():
+ yield 'a'
+ raise KeyboardInterrupt()
+ f = self.MODULE.StringIO()
+ self.assertRaises(KeyboardInterrupt, f.writelines, errorGen())
+
def test_truncate(self):
eq = self.assertEqual
f = self.MODULE.StringIO()
diff --git a/Misc/ACKS b/Misc/ACKS
index bc9ee2b..c1cb855 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -50,6 +50,7 @@ Reimer Behrends
Thomas Bellman
Juan M. Bello Rivas
Alexander Belopolsky
+Andrew Bennetts
Andy Bensky
Michel Van den Bergh
Eric Beser
diff --git a/Misc/NEWS b/Misc/NEWS
index 9144f5d..93c2ba0 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -149,6 +149,9 @@ present).
Extension Modules
-----------------
+- Patches #1298449 and #1298499: Add some missing checks for error
+ returns in cStringIO.c.
+
- Patch #1297028: fix segfault if call type on MultibyteCodec,
MultibyteStreamReader, or MultibyteStreamWriter
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index b7333fd..9ed77d8 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -241,7 +241,10 @@ IO_readlines(IOobject *self, PyObject *args) {
line = PyString_FromStringAndSize (output, n);
if (!line)
goto err;
- PyList_Append (result, line);
+ if (PyList_Append (result, line) == -1) {
+ Py_DECREF (line);
+ goto err;
+ }
Py_DECREF (line);
length += n;
if (hint > 0 && length >= hint)
@@ -440,13 +443,18 @@ O_writelines(Oobject *self, PyObject *args) {
Py_DECREF(it);
Py_DECREF(s);
return NULL;
- }
- Py_DECREF(s);
- }
- Py_DECREF(it);
- Py_RETURN_NONE;
-}
+ }
+ Py_DECREF(s);
+ }
+ Py_DECREF(it);
+
+ /* See if PyIter_Next failed */
+ if (PyErr_Occurred())
+ return NULL;
+
+ Py_RETURN_NONE;
+}
static struct PyMethodDef O_methods[] = {
/* Common methods: */
{"flush", (PyCFunction)IO_flush, METH_NOARGS, IO_flush__doc__},