]> granicus.if.org Git - python/commitdiff
Issue #5334: array.fromfile() failed to insert values when EOFError was raised.
authorHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Fri, 6 Mar 2009 03:04:07 +0000 (03:04 +0000)
committerHirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
Fri, 6 Mar 2009 03:04:07 +0000 (03:04 +0000)
Reviewed by Benjamin Peterson.

Lib/test/test_array.py
Misc/NEWS
Modules/arraymodule.c

index c8698bb40e112906d86a028b383f708ff3c7116c..8e228391bc5face0314f9b116f5515e4c38938e7 100755 (executable)
@@ -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:
index 24b87291efa2d88a904bd835490616ae15042ac0..f55944adb65e77dc93a0721673eade9e7cba0494 100644 (file)
--- 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.
index e55c2d0c9c068c45132ea6905767004068b8649b..b39da8e96358a8521c62996e13f1ec351c01648c 100644 (file)
@@ -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;
 }