diff options
author | Christian Stocker <chregu@php.net> | 2003-04-08 19:30:27 +0000 |
---|---|---|
committer | Christian Stocker <chregu@php.net> | 2003-04-08 19:30:27 +0000 |
commit | 7a14e6358a1e24505c8337759842e126ea5a20ff (patch) | |
tree | c0d0057d54b8d3f187194679049b4b2897d0fe28 /ext/domxml/php_domxml.c | |
parent | 00a18c470d971d71083d6003db0dba136c676f2c (diff) | |
download | php-git-7a14e6358a1e24505c8337759842e126ea5a20ff.tar.gz |
fixes memleaks in element->get_elements_by_tagname & document->get_elements_by_tagname
Diffstat (limited to 'ext/domxml/php_domxml.c')
-rw-r--r-- | ext/domxml/php_domxml.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c index 529c1345d7..41c25746f8 100644 --- a/ext/domxml/php_domxml.c +++ b/ext/domxml/php_domxml.c @@ -3079,6 +3079,7 @@ PHP_FUNCTION(domxml_doc_get_elements_by_tagname) xmlXPathObjectPtr xpathobjp; xmlNode *contextnodep; int name_len; + int free_context = 0; char *str,*name; contextnode = NULL; @@ -3089,6 +3090,7 @@ PHP_FUNCTION(domxml_doc_get_elements_by_tagname) /* if no xpath_context was submitted, create a new one */ if (ctxpin == NULL) { ctxp = xmlXPathNewContext(docp); + free_context = 1; } else { DOMXML_GET_OBJ(ctxp, ctxpin, le_xpathctxp); } @@ -3119,6 +3121,10 @@ PHP_FUNCTION(domxml_doc_get_elements_by_tagname) if (NULL == (nodesetp = xpathobjp->nodesetval)) { zval_dtor(rv); + xmlXPathFreeObject (xpathobjp); + if (free_context) { + xmlXPathFreeContext(ctxp); + } RETURN_FALSE; } @@ -3138,6 +3144,10 @@ PHP_FUNCTION(domxml_doc_get_elements_by_tagname) break; } + xmlXPathFreeObject(xpathobjp); + if (free_context) { + xmlXPathFreeContext(ctxp); + } *return_value = *rv; FREE_ZVAL(rv); } @@ -3215,6 +3225,7 @@ PHP_FUNCTION(domxml_elem_get_elements_by_tagname) zend_hash_next_index_insert(Z_ARRVAL_P(rv), &child, sizeof(zval *), NULL); } } + xmlXPathFreeNodeSet(nodesetp); *return_value = *rv; FREE_ZVAL(rv); |