summaryrefslogtreecommitdiffstats
path: root/Modules/pyexpat.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/pyexpat.c')
-rw-r--r--Modules/pyexpat.c34
1 files changed, 18 insertions, 16 deletions
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 01ac14e..f04620f 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -10,6 +10,9 @@
#define FIX_TRACE
+static XML_Memory_Handling_Suite ExpatMemoryHandler = {
+ PyObject_Malloc, PyObject_Realloc, PyObject_Free};
+
enum HandlerTypes {
StartElement,
EndElement,
@@ -997,7 +1000,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
PyObject_GC_Track(new_parser);
if (self->buffer != NULL) {
- new_parser->buffer = malloc(new_parser->buffer_size);
+ new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
if (new_parser->buffer == NULL) {
Py_DECREF(new_parser);
return PyErr_NoMemory();
@@ -1014,7 +1017,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
for (i = 0; handler_info[i].name != NULL; i++)
/* do nothing */;
- new_parser->handlers = malloc(sizeof(PyObject *) * i);
+ new_parser->handlers = PyMem_Malloc(sizeof(PyObject *) * i);
if (!new_parser->handlers) {
Py_DECREF(new_parser);
return PyErr_NoMemory();
@@ -1128,8 +1131,10 @@ PyUnknownEncodingHandler(void *encodingHandlerData,
}
u = PyUnicode_Decode((char*) template_buffer, 256, name, "replace");
- if (u == NULL || PyUnicode_READY(u))
+ if (u == NULL || PyUnicode_READY(u)) {
+ Py_XDECREF(u);
return XML_STATUS_ERROR;
+ }
if (PyUnicode_GET_LENGTH(u) != 256) {
Py_DECREF(u);
@@ -1175,12 +1180,9 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)
self->in_callback = 0;
self->ns_prefixes = 0;
self->handlers = NULL;
- if (namespace_separator != NULL) {
- self->itself = XML_ParserCreateNS(encoding, *namespace_separator);
- }
- else {
- self->itself = XML_ParserCreate(encoding);
- }
+ /* namespace_separator is either NULL or contains one char + \0 */
+ self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler,
+ namespace_separator);
#if ((XML_MAJOR_VERSION >= 2) && (XML_MINOR_VERSION >= 1)) || defined(XML_HAS_SET_HASH_SALT)
/* This feature was added upstream in libexpat 2.1.0. Our expat copy
* has a backport of this feature where we also define XML_HAS_SET_HASH_SALT
@@ -1204,7 +1206,7 @@ newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)
for (i = 0; handler_info[i].name != NULL; i++)
/* do nothing */;
- self->handlers = malloc(sizeof(PyObject *) * i);
+ self->handlers = PyMem_Malloc(sizeof(PyObject *) * i);
if (!self->handlers) {
Py_DECREF(self);
return PyErr_NoMemory();
@@ -1231,11 +1233,11 @@ xmlparse_dealloc(xmlparseobject *self)
self->handlers[i] = NULL;
Py_XDECREF(temp);
}
- free(self->handlers);
+ PyMem_Free(self->handlers);
self->handlers = NULL;
}
if (self->buffer != NULL) {
- free(self->buffer);
+ PyMem_Free(self->buffer);
self->buffer = NULL;
}
Py_XDECREF(self->intern);
@@ -1435,7 +1437,7 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
return -1;
if (b) {
if (self->buffer == NULL) {
- self->buffer = malloc(self->buffer_size);
+ self->buffer = PyMem_Malloc(self->buffer_size);
if (self->buffer == NULL) {
PyErr_NoMemory();
return -1;
@@ -1446,7 +1448,7 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
else if (self->buffer != NULL) {
if (flush_character_buffer(self) < 0)
return -1;
- free(self->buffer);
+ PyMem_Free(self->buffer);
self->buffer = NULL;
}
return 0;
@@ -1506,9 +1508,9 @@ xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
flush_character_buffer(self);
}
/* free existing buffer */
- free(self->buffer);
+ PyMem_Free(self->buffer);
}
- self->buffer = malloc(new_buffer_size);
+ self->buffer = PyMem_Malloc(new_buffer_size);
if (self->buffer == NULL) {
PyErr_NoMemory();
return -1;