mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-01-12 09:17:37 +03:00
fix a memory errro when using namespace nodes returned from XPath queries,
* python/types.c: fix a memory errro when using namespace nodes returned from XPath queries, should fix #521699 * python/tests/Makefile.am python/tests/xpathns.py: add a specific regression test for it Daniel svn path=/trunk/; revision=3703
This commit is contained in:
parent
a544c18909
commit
5d279c95f8
@ -1,3 +1,10 @@
|
|||||||
|
Wed Mar 12 10:22:01 CET 2008 Daniel Veillard <daniel@veillard.com>
|
||||||
|
|
||||||
|
* python/types.c: fix a memory errro when using namespace nodes
|
||||||
|
returned from XPath queries, should fix #521699
|
||||||
|
* python/tests/Makefile.am python/tests/xpathns.py: add a specific
|
||||||
|
regression test for it
|
||||||
|
|
||||||
Mon Mar 10 16:25:32 CET 2008 Rob Richards <rrichards@ctindustries.net>
|
Mon Mar 10 16:25:32 CET 2008 Rob Richards <rrichards@ctindustries.net>
|
||||||
|
|
||||||
* include/win32config.h: add ICONV_CONST define for win32 build
|
* include/win32config.h: add ICONV_CONST define for win32 build
|
||||||
|
@ -45,7 +45,8 @@ PYTESTS= \
|
|||||||
validDTD.py \
|
validDTD.py \
|
||||||
validSchemas.py \
|
validSchemas.py \
|
||||||
validRNG.py \
|
validRNG.py \
|
||||||
compareNodes.py
|
compareNodes.py \
|
||||||
|
xpathns.py
|
||||||
|
|
||||||
XMLS= \
|
XMLS= \
|
||||||
tst.xml \
|
tst.xml \
|
||||||
|
29
python/tests/xpathns.py
Executable file
29
python/tests/xpathns.py
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/python -u
|
||||||
|
#
|
||||||
|
import libxml2
|
||||||
|
|
||||||
|
expect=' xmlns:a="urn:whatevar"'
|
||||||
|
|
||||||
|
# Memory debug specific
|
||||||
|
libxml2.debugMemory(1)
|
||||||
|
|
||||||
|
d = libxml2.parseDoc("<a:a xmlns:a='urn:whatevar'/>")
|
||||||
|
res=""
|
||||||
|
for n in d.xpathEval("//namespace::*"):
|
||||||
|
res = res + n.serialize()
|
||||||
|
d.freeDoc()
|
||||||
|
|
||||||
|
if res != expect:
|
||||||
|
print "test5 failed: unexpected output"
|
||||||
|
print res
|
||||||
|
del res
|
||||||
|
del d
|
||||||
|
del n
|
||||||
|
# Memory debug specific
|
||||||
|
libxml2.cleanupParser()
|
||||||
|
|
||||||
|
if libxml2.debugMemory(1) == 0:
|
||||||
|
print "OK"
|
||||||
|
else:
|
||||||
|
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
|
||||||
|
libxml2.dumpMemory()
|
@ -7,6 +7,7 @@
|
|||||||
* daniel@veillard.com
|
* daniel@veillard.com
|
||||||
*/
|
*/
|
||||||
#include "libxml_wrap.h"
|
#include "libxml_wrap.h"
|
||||||
|
#include <libxml/xpathInternals.h>
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
libxml_intWrap(int val)
|
libxml_intWrap(int val)
|
||||||
@ -330,6 +331,24 @@ libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt)
|
|||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* libxml_xmlXPathDestructNsNode:
|
||||||
|
* cobj: xmlNsPtr namespace node
|
||||||
|
* desc: ignored string
|
||||||
|
*
|
||||||
|
* This function is called if and when a namespace node returned in
|
||||||
|
* an XPath node set is to be destroyed. That's the only kind of
|
||||||
|
* object returned in node set not directly linked to the original
|
||||||
|
* xmlDoc document, see xmlXPathNodeSetDupNs.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
libxml_xmlXPathDestructNsNode(void *cobj, void *desc ATTRIBUTE_UNUSED) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "libxml_xmlXPathDestructNsNode called %p\n", cobj);
|
||||||
|
#endif
|
||||||
|
xmlXPathNodeSetFreeNs((xmlNsPtr) cobj);
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
|
libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
|
||||||
{
|
{
|
||||||
@ -380,8 +399,17 @@ libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
|
|||||||
ret = PyList_New(obj->nodesetval->nodeNr);
|
ret = PyList_New(obj->nodesetval->nodeNr);
|
||||||
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
|
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
|
||||||
node = obj->nodesetval->nodeTab[i];
|
node = obj->nodesetval->nodeTab[i];
|
||||||
/* TODO: try to cast directly to the proper node type */
|
if (node->type == XML_NAMESPACE_DECL) {
|
||||||
PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
|
PyObject *ns =
|
||||||
|
PyCObject_FromVoidPtrAndDesc((void *) node,
|
||||||
|
(char *) "xmlNsPtr",
|
||||||
|
libxml_xmlXPathDestructNsNode);
|
||||||
|
PyList_SetItem(ret, i, ns);
|
||||||
|
/* make sure the xmlNsPtr is not destroyed now */
|
||||||
|
obj->nodesetval->nodeTab[i] = NULL;
|
||||||
|
} else {
|
||||||
|
PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user