[Python-checkins] r87911 - python/branches/py3k/Modules/pyexpat.c

victor.stinner python-checkins at python.org
Tue Jan 11 00:00:42 CET 2011


Author: victor.stinner
Date: Tue Jan 11 00:00:36 2011
New Revision: 87911

Log:
Issue #9566: Fix pyparse.xmlparser.ParseFile()

Fix readinst() if file.read(n) returns a bytes object longer than n:
return -1 instead of the the buffer size to raise an exception.
Simplify also the function code.

Modified:
   python/branches/py3k/Modules/pyexpat.c

Modified: python/branches/py3k/Modules/pyexpat.c
==============================================================================
--- python/branches/py3k/Modules/pyexpat.c	(original)
+++ python/branches/py3k/Modules/pyexpat.c	Tue Jan 11 00:00:36 2011
@@ -797,25 +797,13 @@
 static int
 readinst(char *buf, int buf_size, PyObject *meth)
 {
-    PyObject *arg = NULL;
-    PyObject *bytes = NULL;
-    PyObject *str = NULL;
-    Py_ssize_t len = -1;
+    PyObject *str;
+    Py_ssize_t len;
     char *ptr;
 
-    if ((bytes = PyLong_FromLong(buf_size)) == NULL)
-        goto finally;
-
-    if ((arg = PyTuple_New(1)) == NULL) {
-        Py_DECREF(bytes);
-        goto finally;
-    }
-
-    PyTuple_SET_ITEM(arg, 0, bytes);
-
-    str = PyObject_Call(meth, arg, NULL);
+    str = PyObject_CallFunction(meth, "n", buf_size);
     if (str == NULL)
-        goto finally;
+        goto error;
 
     if (PyBytes_Check(str))
         ptr = PyBytes_AS_STRING(str);
@@ -825,7 +813,7 @@
         PyErr_Format(PyExc_TypeError,
                      "read() did not return a bytes object (type=%.400s)",
                      Py_TYPE(str)->tp_name);
-        goto finally;
+        goto error;
     }
     len = Py_SIZE(str);
     if (len > buf_size) {
@@ -833,14 +821,16 @@
                      "read() returned too much data: "
                      "%i bytes requested, %zd returned",
                      buf_size, len);
-        goto finally;
+        goto error;
     }
     memcpy(buf, ptr, len);
-finally:
-    Py_XDECREF(arg);
-    Py_XDECREF(str);
-    /* len <= buf_size <= INT_MAX (see above) */
+    Py_DECREF(str);
+    /* len <= buf_size <= INT_MAX */
     return (int)len;
+
+error:
+    Py_XDECREF(str);
+    return -1;
 }
 
 PyDoc_STRVAR(xmlparse_ParseFile__doc__,


More information about the Python-checkins mailing list