summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>2009-03-06 03:04:07 (GMT)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>2009-03-06 03:04:07 (GMT)
commit54d0df69c0a57b5d5447f483494293354656c4fa (patch)
tree37c4c0e898a6fefb53359f83d5d6b23e23d1e992
parent3aed8d511014df6409758706e5179aeeb7cc80ee (diff)
downloadcpython-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-xLib/test/test_array.py3
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/arraymodule.c17
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:
diff --git a/Misc/NEWS b/Misc/NEWS
index 24b8729..f55944a 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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;
}