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

Reply via email to