diff options
author | Christian Stocker <chregu@php.net> | 2002-11-30 10:38:17 +0000 |
---|---|---|
committer | Christian Stocker <chregu@php.net> | 2002-11-30 10:38:17 +0000 |
commit | 3429e3313b9a50fe966c1548a1b11fc493631d39 (patch) | |
tree | dfa2b5c053bf50b49ab5db19562f9d19fe743afe | |
parent | 5d554c20d27ed26e7010404f84d8eb1981d24b9c (diff) | |
download | php-git-3429e3313b9a50fe966c1548a1b11fc493631d39.tar.gz |
fixed big bad memory leak in xpath objects.
-rw-r--r-- | ext/domxml/php_domxml.c | 83 |
1 files changed, 2 insertions, 81 deletions
diff --git a/ext/domxml/php_domxml.c b/ext/domxml/php_domxml.c index ac0c072ea3..d147a0aff9 100644 --- a/ext/domxml/php_domxml.c +++ b/ext/domxml/php_domxml.c @@ -698,19 +698,6 @@ static void php_free_xpath_context(zend_rsrc_list_entry *rsrc TSRMLS_DC) xmlXPathFreeContext(ctx); } } - -static void php_free_xpath_object(zend_rsrc_list_entry *rsrc TSRMLS_DC) -{ - xmlXPathObjectPtr obj = (xmlXPathObjectPtr) rsrc->ptr; - - if (obj) { - if (obj->user) { - zval *wrapper = obj->user; - zval_ptr_dtor(&wrapper); - } - xmlXPathFreeObject(obj); - } -} #endif static void php_free_xml_parser(zend_rsrc_list_entry *rsrc TSRMLS_DC) @@ -843,79 +830,12 @@ void *php_xpath_get_object(zval *wrapper, int rsrc_type1, int rsrc_type2 TSRMLS_ return obj; } - -static void xpath_object_set_data(void *obj, zval *wrapper) -{ -/* - char tmp[20]; - sprintf(tmp, "%08X", obj); - fprintf(stderr, "Adding %s to hash\n", tmp); -*/ - ((xmlXPathObjectPtr) obj)->user = wrapper; -} - - -static zval *xpath_object_get_data(void *obj) -{ -/* - char tmp[20]; - sprintf(tmp, "%08X", obj); - fprintf(stderr, "Trying getting %s from hash ...", tmp); - if(((xmlXPathObjectPtr) obj)->user) - fprintf(stderr, " found\n"); - else - fprintf(stderr, " not found\n"); -*/ - return ((zval *) (((xmlXPathObjectPtr) obj)->user)); -} - - -static void php_xpath_set_object(zval *wrapper, void *obj, int rsrc_type) -{ - zval *handle, *addr; - - MAKE_STD_ZVAL(handle); - Z_TYPE_P(handle) = IS_LONG; - Z_LVAL_P(handle) = zend_list_insert(obj, rsrc_type); - - MAKE_STD_ZVAL(addr); - Z_TYPE_P(addr) = IS_LONG; - Z_LVAL_P(addr) = (int) obj; - - zend_hash_index_update(Z_OBJPROP_P(wrapper), 0, &handle, sizeof(zval *), NULL); - zend_hash_index_update(Z_OBJPROP_P(wrapper), 1, &addr, sizeof(zval *), NULL); - zval_add_ref(&wrapper); - xpath_object_set_data(obj, wrapper); -} - static zval *php_xpathobject_new(xmlXPathObjectPtr obj, int *found TSRMLS_DC) { zval *wrapper; - *found = 0; - - if (!obj) { - MAKE_STD_ZVAL(wrapper); - ZVAL_NULL(wrapper); - return wrapper; - } - - if ((wrapper = (zval *) xpath_object_get_data((void *) obj))) { - zval_add_ref(&wrapper); - *found = 1; - return wrapper; - } - MAKE_STD_ZVAL(wrapper); object_init_ex(wrapper, xpathobject_class_entry); - -/* - rsrc_type = le_xpathobjectp; - php_xpath_set_object(wrapper, (void *) obj, rsrc_type); -*/ - - php_xpath_set_object(wrapper, (void *) obj, le_xpathobjectp); - return (wrapper); } @@ -1575,7 +1495,7 @@ PHP_MINIT_FUNCTION(domxml) #if defined(LIBXML_XPATH_ENABLED) le_xpathctxp = zend_register_list_destructors_ex(php_free_xpath_context, NULL, "xpathcontext", module_number); - le_xpathobjectp = zend_register_list_destructors_ex(php_free_xpath_object, NULL, "xpathobject", module_number); + le_xpathobjectp = zend_register_list_destructors_ex(NULL, NULL, "xpathobject", module_number); #endif /* le_domxmlnsp = register_list_destructors(NULL, NULL); */ @@ -4853,6 +4773,7 @@ static void php_xpathptr_eval(INTERNAL_FUNCTION_PARAMETERS, int mode, int expr) break; } + xmlXPathFreeObject(xpathobjp); *return_value = *rv; FREE_ZVAL(rv); } |