diff options
author | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2009-03-06 03:04:07 (GMT) |
---|---|---|
committer | Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp> | 2009-03-06 03:04:07 (GMT) |
commit | 54d0df69c0a57b5d5447f483494293354656c4fa (patch) | |
tree | 37c4c0e898a6fefb53359f83d5d6b23e23d1e992 | |
parent | 3aed8d511014df6409758706e5179aeeb7cc80ee (diff) | |
download | cpython-54d0df69c0a57b5d5447f483494293354656c4fa.zip cpython-54d0df69c0a57b5d5447f483494293354656c4fa.tar.gz cpython-54d0df69c0a57b5d5447f483494293354656c4fa.tar.bz2 |
Issue #5334: array.fromfile() failed to insert values when EOFError was raised.
Reviewed by Benjamin Peterson.
-rwxr-xr-x | Lib/test/test_array.py | 3 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/arraymodule.c | 17 |
3 files changed, 14 insertions, 8 deletions
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index c8698bb..8e22839 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -174,9 +174,8 @@ class BaseTest(unittest.TestCase): b.fromfile(f, len(self.example)) self.assertEqual(b, array.array(self.typecode, self.example)) self.assertNotEqual(a, b) - b.fromfile(f, len(self.example)) + self.assertRaises(EOFError, b.fromfile, f, len(self.example)+1) self.assertEqual(a, b) - self.assertRaises(EOFError, b.fromfile, f, 1) f.close() finally: if not f.closed: @@ -183,6 +183,8 @@ Core and Builtins Library ------- +- Issue #5334: array.fromfile() failed to insert values when EOFError was raised. + - Issue #5385: Fixed mmap crash after resize failure on windows. - Issue #5179: Fixed subprocess handle leak on failure on windows. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index e55c2d0..b39da8e 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1201,6 +1201,7 @@ array_fromfile(arrayobject *self, PyObject *args) PyObject *f, *b, *res; Py_ssize_t itemsize = self->ob_descr->itemsize; Py_ssize_t n, nbytes; + int not_enough_bytes; if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n)) return NULL; @@ -1222,12 +1223,7 @@ array_fromfile(arrayobject *self, PyObject *args) return NULL; } - if (PyBytes_GET_SIZE(b) != nbytes) { - PyErr_SetString(PyExc_EOFError, - "read() didn't return enough bytes"); - Py_DECREF(b); - return NULL; - } + not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes); args = Py_BuildValue("(O)", b); Py_DECREF(b); @@ -1236,6 +1232,15 @@ array_fromfile(arrayobject *self, PyObject *args) res = array_fromstring(self, args); Py_DECREF(args); + if (res == NULL) + return NULL; + + if (not_enough_bytes) { + PyErr_SetString(PyExc_EOFError, + "read() didn't return enough bytes"); + Py_DECREF(res); + return NULL; + } return res; } |