Commit 54d0df69 authored by Hirokazu Yamamoto's avatar Hirokazu Yamamoto

Issue #5334: array.fromfile() failed to insert values when EOFError was raised.

Reviewed by Benjamin Peterson.
parent 3aed8d51
...@@ -174,9 +174,8 @@ class BaseTest(unittest.TestCase): ...@@ -174,9 +174,8 @@ class BaseTest(unittest.TestCase):
b.fromfile(f, len(self.example)) b.fromfile(f, len(self.example))
self.assertEqual(b, array.array(self.typecode, self.example)) self.assertEqual(b, array.array(self.typecode, self.example))
self.assertNotEqual(a, b) 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.assertEqual(a, b)
self.assertRaises(EOFError, b.fromfile, f, 1)
f.close() f.close()
finally: finally:
if not f.closed: if not f.closed:
......
...@@ -183,6 +183,8 @@ Core and Builtins ...@@ -183,6 +183,8 @@ Core and Builtins
Library Library
------- -------
- Issue #5334: array.fromfile() failed to insert values when EOFError was raised.
- Issue #5385: Fixed mmap crash after resize failure on windows. - Issue #5385: Fixed mmap crash after resize failure on windows.
- Issue #5179: Fixed subprocess handle leak on failure on windows. - Issue #5179: Fixed subprocess handle leak on failure on windows.
......
...@@ -1201,6 +1201,7 @@ array_fromfile(arrayobject *self, PyObject *args) ...@@ -1201,6 +1201,7 @@ array_fromfile(arrayobject *self, PyObject *args)
PyObject *f, *b, *res; PyObject *f, *b, *res;
Py_ssize_t itemsize = self->ob_descr->itemsize; Py_ssize_t itemsize = self->ob_descr->itemsize;
Py_ssize_t n, nbytes; Py_ssize_t n, nbytes;
int not_enough_bytes;
if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n)) if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
return NULL; return NULL;
...@@ -1222,12 +1223,7 @@ array_fromfile(arrayobject *self, PyObject *args) ...@@ -1222,12 +1223,7 @@ array_fromfile(arrayobject *self, PyObject *args)
return NULL; return NULL;
} }
if (PyBytes_GET_SIZE(b) != nbytes) { not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
PyErr_SetString(PyExc_EOFError,
"read() didn't return enough bytes");
Py_DECREF(b);
return NULL;
}
args = Py_BuildValue("(O)", b); args = Py_BuildValue("(O)", b);
Py_DECREF(b); Py_DECREF(b);
...@@ -1236,6 +1232,15 @@ array_fromfile(arrayobject *self, PyObject *args) ...@@ -1236,6 +1232,15 @@ array_fromfile(arrayobject *self, PyObject *args)
res = array_fromstring(self, args); res = array_fromstring(self, args);
Py_DECREF(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; return res;
} }
......
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