cvs: php4(PHP_4_3) /ext/com COM.c com.h

From: Date: Mon, 24 Feb 2003 18:30:20 +0000
Subject: cvs: php4(PHP_4_3) /ext/com COM.c com.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-19143@lists.php.net to get a copy of this message
phanto Mon Feb 24 13:30:20 2003 EDT Modified files: (Branch: PHP_4_3) /php4/ext/com COM.c com.h Log: fix memleak and wrong refcounting Index: php4/ext/com/COM.c diff -u php4/ext/com/COM.c:1.90.2.4 php4/ext/com/COM.c:1.90.2.5 --- php4/ext/com/COM.c:1.90.2.4 Sun Feb 9 19:45:15 2003 +++ php4/ext/com/COM.c Mon Feb 24 13:30:19 2003 @@ -18,7 +18,7 @@ | Wez Furlong <wez@thebrainroom.com> | +----------------------------------------------------------------------+ */ -/* $Id: COM.c,v 1.90.2.4 2003/02/10 00:45:15 phanto Exp $ */ +/* $Id: COM.c,v 1.90.2.5 2003/02/24 18:30:19 phanto Exp $ */ /* * This module implements support for COM components that support the IDispatch * interface. Both local (COM) and remote (DCOM) components can be accessed. @@ -896,7 +896,7 @@ efree(funcname); for (current_arg=0;current_arg<arg_count;current_arg++) { /* don't release IDispatch pointers as they are used afterwards */ - if (V_VT(&variant_args[current_arg]) != VT_DISPATCH) { + if (V_VT(&(variant_args[current_arg])) != VT_DISPATCH) { /* @todo review this: what happens to an array of IDispatchs or a VARIANT->IDispatch */ VariantClear(&variant_args[current_arg]); } @@ -1789,7 +1789,6 @@ zend_overloaded_element *overloaded_property; zend_llist_element *element; pval retval; - pval *return_value = &retval; pval **comval_handle; pval *object = property_reference->object; int type; @@ -1835,18 +1834,18 @@ FREE_VARIANT(var_result); if (obj != obj_prop) { - FREE_COM(obj_prop); + efree(obj_prop); retval = *object; - ZVAL_ADDREF(return_value); + zval_copy_ctor(&retval); } else { - RETVAL_COM(obj); + ZVAL_COM(&retval, obj); } return retval; } - pval_destructor(&overloaded_property->element); + zval_dtor(&overloaded_property->element); if (V_VT(var_result) == VT_DISPATCH) { if (V_DISPATCH(var_result) == NULL) { @@ -1860,7 +1859,7 @@ php_COM_set(obj, &V_DISPATCH(var_result), TRUE TSRMLS_CC); VariantInit(var_result); // to protect C_DISPATCH(obj) from being freed when var_result is destructed } else { - php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC); + php_variant_to_pval(var_result, &retval, codepage TSRMLS_CC); FREE_COM(obj_prop); obj_prop = NULL; @@ -1868,7 +1867,7 @@ } if (obj_prop != NULL) { - RETVAL_COM(obj); + ZVAL_COM(&retval, obj); } @@ -1944,7 +1943,7 @@ } VariantInit(var_result); // to protect C_DISPATCH(obj) from being freed when var_result is destructed - pval_destructor(&overloaded_property->element); + zval_dtor(&overloaded_property->element); } FREE_VARIANT(var_result); @@ -1952,7 +1951,7 @@ do_COM_propput(NULL, obj, &overloaded_property->element, value TSRMLS_CC); FREE_COM(obj_prop); - pval_destructor(&overloaded_property->element); + zval_dtor(&overloaded_property->element); return SUCCESS; } @@ -1984,9 +1983,14 @@ && !strcmp(Z_STRVAL(function_name->element), "com")) { /* constructor */ PHP_FN(com_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU); + /* free instance created by 'new' */ + zval_dtor(object); + + /* and override it with the instance created by 'com_load()' */ *object = *return_value; - pval_copy_constructor(object); - pval_destructor(&function_name->element); + INIT_ZVAL(*return_value); + + zval_dtor(&function_name->element); return; } @@ -1994,8 +1998,8 @@ property = php_COM_get_property_handler(property_reference); if (Z_TYPE(property) != IS_OBJECT) { - pval_destructor(&property); - pval_destructor(&function_name->element); + zval_dtor(&property); + zval_dtor(&function_name->element); /* error message - function call on a non-object */ return; @@ -2005,8 +2009,8 @@ obj = (comval *)zend_list_find(Z_LVAL_PP(handle), &type); if (!obj || (type != IS_COM)) { - pval_destructor(&property); - pval_destructor(&function_name->element); + zval_dtor(&property); + zval_dtor(&function_name->element); return; } @@ -2024,7 +2028,7 @@ ALLOC_VARIANT(var_result); - arguments = (pval **) emalloc(sizeof(pval *)*arg_count); + arguments = (zval **) emalloc(sizeof(zval *)*arg_count); zend_get_parameters_array(ht, arg_count, arguments); if (do_COM_invoke(obj , DISPATCH_METHOD|DISPATCH_PROPERTYGET, &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == SUCCESS) { @@ -2036,13 +2040,8 @@ efree(arguments); } - if (zend_llist_count(property_reference->elements_list) > 1) { - /* destruct temporary object */ - zend_list_delete(Z_LVAL_PP(handle)); - pval_destructor(&property); - } - - pval_destructor(&function_name->element); + zval_dtor(&property); + zval_dtor(&function_name->element); } Index: php4/ext/com/com.h diff -u php4/ext/com/com.h:1.13.4.1 php4/ext/com/com.h:1.13.4.2 --- php4/ext/com/com.h:1.13.4.1 Tue Jan 28 19:10:00 2003 +++ php4/ext/com/com.h Mon Feb 24 13:30:20 2003 @@ -51,8 +51,7 @@ #define RETURN_COM(o) RETVAL_COM(o) \ return; -#define ALLOC_COM(z) (z) = (comval *) ecalloc(1, sizeof(comval)); \ - C_REFCOUNT(z) = 0; +#define ALLOC_COM(z) (z) = (comval *) ecalloc(1, sizeof(comval)); #define FREE_COM(z) php_COM_destruct(z TSRMLS_CC);

« previous php.cvs (#19143) next »