diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-19 18:22:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-19 18:22:49 (GMT) |
commit | 680fea4067537a9b9c79aadd44a3a19e83cd2dbf (patch) | |
tree | baf7cb3259f1b27e82d5166e5a88fd4e0f557ea4 /Modules/_io | |
parent | 8e5b52a8da07e781bda50ba0a7065b1058495a37 (diff) | |
download | cpython-680fea4067537a9b9c79aadd44a3a19e83cd2dbf.zip cpython-680fea4067537a9b9c79aadd44a3a19e83cd2dbf.tar.gz cpython-680fea4067537a9b9c79aadd44a3a19e83cd2dbf.tar.bz2 |
bpo-30061: Check if PyObject_Size()/PySequence_Size()/PyMapping_Size() (#1096) (#1180)
raised an error.
(cherry picked from commit bf623ae8843dc30b28c574bec8d29fc14be59d86)
Diffstat (limited to 'Modules/_io')
-rw-r--r-- | Modules/_io/iobase.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index f7986d7..c864204 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -625,7 +625,8 @@ iobase_iternext(PyObject *self) if (line == NULL) return NULL; - if (PyObject_Size(line) == 0) { + if (PyObject_Size(line) <= 0) { + /* Error or empty */ Py_DECREF(line); return NULL; } @@ -676,6 +677,7 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) } while (1) { + Py_ssize_t line_length; PyObject *line = PyIter_Next(it); if (line == NULL) { if (PyErr_Occurred()) { @@ -689,11 +691,14 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) Py_DECREF(line); goto error; } - length += PyObject_Size(line); + line_length = PyObject_Size(line); Py_DECREF(line); - - if (length > hint) + if (line_length < 0) { + goto error; + } + if (line_length > hint - length) break; + length += line_length; } Py_DECREF(it); |