[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