Commit 36b365cc authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #17089: Expat parser now correctly works with string input not only when

an internal XML encoding is UTF-8 or US-ASCII.  It now accepts bytes and
strings larger than 2 GiB.
parents b7be42b1 43536e9e
This diff is collapsed.
......@@ -163,6 +163,10 @@ Core and Builtins
Library
-------
- Issue #17089: Expat parser now correctly works with string input not only when
an internal XML encoding is UTF-8 or US-ASCII. It now accepts bytes and
strings larger than 2 GiB.
- Issue #6083: Fix multiple segmentation faults occured when PyArg_ParseTuple
parses nested mutating sequence.
......
......@@ -778,17 +778,49 @@ PyDoc_STRVAR(xmlparse_Parse__doc__,
"Parse(data[, isfinal])\n\
Parse XML data. `isfinal' should be true at end of input.");
#define MAX_CHUNK_SIZE (1 << 20)
static PyObject *
xmlparse_Parse(xmlparseobject *self, PyObject *args)
{
char *s;
int slen;
PyObject *data;
int isFinal = 0;
const char *s;
Py_ssize_t slen;
Py_buffer view;
int rc;
if (!PyArg_ParseTuple(args, "O|i:Parse", &data, &isFinal))
return NULL;
if (!PyArg_ParseTuple(args, "s#|i:Parse", &s, &slen, &isFinal))
if (PyUnicode_Check(data)) {
view.buf = NULL;
s = PyUnicode_AsUTF8AndSize(data, &slen);
if (s == NULL)
return NULL;
/* Explicitly set UTF-8 encoding. Return code ignored. */
(void)XML_SetEncoding(self->itself, "utf-8");
}
else {
if (PyObject_GetBuffer(data, &view, PyBUF_SIMPLE) < 0)
return NULL;
s = view.buf;
slen = view.len;
}
while (slen > MAX_CHUNK_SIZE) {
rc = XML_Parse(self->itself, s, MAX_CHUNK_SIZE, 0);
if (!rc)
goto done;
s += MAX_CHUNK_SIZE;
slen -= MAX_CHUNK_SIZE;
}
rc = XML_Parse(self->itself, s, slen, isFinal);
return get_parse_result(self, XML_Parse(self->itself, s, slen, isFinal));
done:
if (view.buf != NULL)
PyBuffer_Release(&view);
return get_parse_result(self, rc);
}
/* File reading copied from cPickle */
......
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