tony2001 Thu Jul 12 09:19:04 2007 UTC Added files: /php-src/ext/standard/tests/general_functions bug41970.phpt
Modified files: /php-src/ext/standard basic_functions.c Log: fix #41970 (call_user_func_*() leaks on failure) http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.864&r2=1.865&diff_format=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.864 php-src/ext/standard/basic_functions.c:1.865 --- php-src/ext/standard/basic_functions.c:1.864 Wed Jul 11 17:39:04 2007 +++ php-src/ext/standard/basic_functions.c Thu Jul 12 09:19:04 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.864 2007/07/11 17:39:04 johannes Exp $ */ +/* $Id: basic_functions.c,v 1.865 2007/07/12 09:19:04 tony2001 Exp $ */ #include "php.h" #include "php_streams.h" @@ -5032,7 +5032,7 @@ Call a user function which is the first parameter */ PHP_FUNCTION(call_user_func) { - zval *retval_ptr = return_value; + zval *retval_ptr = NULL; zend_fcall_info fci; zend_fcall_info_cache fci_cache; @@ -5040,13 +5040,12 @@ return; } - fci.retval_ptr_ptr = return_value_ptr; + fci.retval_ptr_ptr = &retval_ptr; if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS) { - zval_ptr_dtor(&retval_ptr); - } - if (!*return_value_ptr) { - ALLOC_INIT_ZVAL(*return_value_ptr); + *return_value = **fci.retval_ptr_ptr; + zval_copy_ctor(return_value); + zval_ptr_dtor(fci.retval_ptr_ptr); } if (fci.params) { @@ -5059,7 +5058,7 @@ Call a user function which is the first parameter with the arguments contained in array */ PHP_FUNCTION(call_user_func_array) { - zval *params, *retval_ptr = return_value; + zval *params, *retval_ptr = NULL; zend_fcall_info fci; zend_fcall_info_cache fci_cache; @@ -5067,15 +5066,13 @@ return; } - fci.retval_ptr_ptr = return_value_ptr; - zend_fcall_info_args(&fci, params TSRMLS_CC); + fci.retval_ptr_ptr = &retval_ptr; if (zend_call_function(&fci, &fci_cache TSRMLS_CC) == SUCCESS) { - zval_ptr_dtor(&retval_ptr); - } - if (!*return_value_ptr) { - ALLOC_INIT_ZVAL(*return_value_ptr); + *return_value = **fci.retval_ptr_ptr; + zval_copy_ctor(return_value); + zval_ptr_dtor(fci.retval_ptr_ptr); } zend_fcall_info_args_clear(&fci, 1); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/bug41970.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/general_functions/bug41970.phpt +++ php-src/ext/standard/tests/general_functions/bug41970.phpt --TEST-- Bug #41970 (call_user_func_*() leaks on failure) --FILE-- <?php $a = array(4,3,2); var_dump(call_user_func_array("sort", array($a))); var_dump(call_user_func_array("strlen", array($a))); var_dump(call_user_func("sort", $a)); var_dump(call_user_func("strlen", $a)); echo "Done\n"; ?> --EXPECTF-- NULL Notice: Array to string conversion in %s on line %d int(5) NULL Notice: Array to string conversion in %s on line %d int(5) Done -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php