summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2003-02-02 03:54:17 (GMT)
committerFred Drake <fdrake@acm.org>2003-02-02 03:54:17 (GMT)
commit06dd8cf5e4100303714f9e3f72b3c52330fdd51c (patch)
treeadbdcb5271145691ec62a629bb91d66de0e89533 /Modules
parentee1a53cbb1302971a65ce6eba9b5e538a3595df0 (diff)
downloadcpython-06dd8cf5e4100303714f9e3f72b3c52330fdd51c.zip
cpython-06dd8cf5e4100303714f9e3f72b3c52330fdd51c.tar.gz
cpython-06dd8cf5e4100303714f9e3f72b3c52330fdd51c.tar.bz2
Fix memory leak: free memory storing the content model passed to the
ElementDeclHandler by Expat. Fixes SF bug #676990.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/pyexpat.c72
1 files changed, 48 insertions, 24 deletions
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 436f891..0f6608a 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -683,35 +683,59 @@ conv_content_model(XML_Content * const model,
return result;
}
-static PyObject *
-conv_content_model_utf8(XML_Content * const model)
+static void
+my_ElementDeclHandler(void *userData,
+ const XML_Char *name,
+ XML_Content *model)
{
- return conv_content_model(model, conv_string_to_utf8);
-}
+ xmlparseobject *self = (xmlparseobject *)userData;
+ PyObject *args = NULL;
-#ifdef Py_USING_UNICODE
-static PyObject *
-conv_content_model_unicode(XML_Content * const model)
-{
- return conv_content_model(model, conv_string_to_unicode);
-}
+ if (have_handler(self, ElementDecl)) {
+ PyObject *rv = NULL;
+ PyObject *modelobj, *nameobj;
-VOID_HANDLER(ElementDecl,
- (void *userData,
- const XML_Char *name,
- XML_Content *model),
- ("NO&",
- string_intern(self, name),
- (self->returns_unicode ? conv_content_model_unicode
- : conv_content_model_utf8),model))
+ if (flush_character_buffer(self) < 0)
+ goto finally;
+#ifdef Py_USING_UNICODE
+ modelobj = conv_content_model(model,
+ (self->returns_unicode
+ ? conv_string_to_unicode
+ : conv_string_to_utf8));
#else
-VOID_HANDLER(ElementDecl,
- (void *userData,
- const XML_Char *name,
- XML_Content *model),
- ("NO&",
- string_intern(self, name), conv_content_model_utf8,model))
+ modelobj = conv_content_model(model, conv_string_to_utf8);
#endif
+ if (modelobj == NULL) {
+ flag_error(self);
+ goto finally;
+ }
+ nameobj = string_intern(self, name);
+ if (nameobj == NULL) {
+ Py_DECREF(modelobj);
+ flag_error(self);
+ goto finally;
+ }
+ args = Py_BuildValue("NN", string_intern(self, name), modelobj);
+ if (args == NULL) {
+ Py_DECREF(modelobj);
+ flag_error(self);
+ goto finally;
+ }
+ self->in_callback = 1;
+ rv = call_with_frame(getcode(ElementDecl, "ElementDecl", __LINE__),
+ self->handlers[ElementDecl], args);
+ self->in_callback = 0;
+ if (rv == NULL) {
+ flag_error(self);
+ goto finally;
+ }
+ Py_DECREF(rv);
+ }
+ finally:
+ Py_XDECREF(args);
+ XML_FreeContentModel(self->itself, model);
+ return;
+}
VOID_HANDLER(AttlistDecl,
(void *userData,