Commit 026435ce authored by Xiang Zhang's avatar Xiang Zhang Committed by GitHub

bpo-30068: add missing iter(self) in _io._IOBase.readlines when hint is present (#1130)

parent eaeda64c
...@@ -3510,6 +3510,7 @@ class MiscIOTest(unittest.TestCase): ...@@ -3510,6 +3510,7 @@ class MiscIOTest(unittest.TestCase):
self.assertRaises(ValueError, f.readinto1, bytearray(1024)) self.assertRaises(ValueError, f.readinto1, bytearray(1024))
self.assertRaises(ValueError, f.readline) self.assertRaises(ValueError, f.readline)
self.assertRaises(ValueError, f.readlines) self.assertRaises(ValueError, f.readlines)
self.assertRaises(ValueError, f.readlines, 1)
self.assertRaises(ValueError, f.seek, 0) self.assertRaises(ValueError, f.seek, 0)
self.assertRaises(ValueError, f.tell) self.assertRaises(ValueError, f.tell)
self.assertRaises(ValueError, f.truncate) self.assertRaises(ValueError, f.truncate)
......
...@@ -310,12 +310,14 @@ Extension Modules ...@@ -310,12 +310,14 @@ Extension Modules
Library Library
------- -------
- bpo-30068: _io._IOBase.readlines will check if it's closed first when
hint is present.
- bpo-29694: Fixed race condition in pathlib mkdir with flags - bpo-29694: Fixed race condition in pathlib mkdir with flags
parents=True. Patch by Armin Rigo. parents=True. Patch by Armin Rigo.
- bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in - bpo-29692: Fixed arbitrary unchaining of RuntimeError exceptions in
contextlib.contextmanager. contextlib.contextmanager. Patch by Siddharth Velankar.
Patch by Siddharth Velankar.
- bpo-26187: Test that sqlite3 trace callback is not called multiple - bpo-26187: Test that sqlite3 trace callback is not called multiple
times when schema is changing. Indirectly fixed by switching to times when schema is changing. Indirectly fixed by switching to
......
...@@ -643,7 +643,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) ...@@ -643,7 +643,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint)
/*[clinic end generated code: output=2f50421677fa3dea input=9400c786ea9dc416]*/ /*[clinic end generated code: output=2f50421677fa3dea input=9400c786ea9dc416]*/
{ {
Py_ssize_t length = 0; Py_ssize_t length = 0;
PyObject *result; PyObject *result, *it = NULL;
result = PyList_New(0); result = PyList_New(0);
if (result == NULL) if (result == NULL)
...@@ -658,19 +658,22 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) ...@@ -658,19 +658,22 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint)
self, NULL); self, NULL);
if (ret == NULL) { if (ret == NULL) {
Py_DECREF(result); goto error;
return NULL;
} }
Py_DECREF(ret); Py_DECREF(ret);
return result; return result;
} }
it = PyObject_GetIter(self);
if (it == NULL) {
goto error;
}
while (1) { while (1) {
PyObject *line = PyIter_Next(self); PyObject *line = PyIter_Next(it);
if (line == NULL) { if (line == NULL) {
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
Py_DECREF(result); goto error;
return NULL;
} }
else else
break; /* StopIteration raised */ break; /* StopIteration raised */
...@@ -678,8 +681,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) ...@@ -678,8 +681,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint)
if (PyList_Append(result, line) < 0) { if (PyList_Append(result, line) < 0) {
Py_DECREF(line); Py_DECREF(line);
Py_DECREF(result); goto error;
return NULL;
} }
length += PyObject_Size(line); length += PyObject_Size(line);
Py_DECREF(line); Py_DECREF(line);
...@@ -687,7 +689,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) ...@@ -687,7 +689,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint)
if (length > hint) if (length > hint)
break; break;
} }
Py_DECREF(it);
return result; return result;
error:
Py_XDECREF(it);
Py_DECREF(result);
return NULL;
} }
/*[clinic input] /*[clinic input]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment