Browse Source

Fixed bug #35229 (call_user_func() crashes when arguement_stack is nearly full)

PHP-5.1
Dmitry Stogov 21 years ago
parent
commit
8bd18e174b
  1. 2
      NEWS
  2. 7
      ext/standard/basic_functions.c
  3. 30
      ext/standard/tests/general_functions/bug35229.phpt

2
NEWS

@ -7,6 +7,8 @@ PHP NEWS
- Fixed bug in mysqli extension with unsigned int(11) being represented as - Fixed bug in mysqli extension with unsigned int(11) being represented as
signed integer in PHP instead of string in 32bit systems. (Andrey) signed integer in PHP instead of string in 32bit systems. (Andrey)
- Fixed initializing and argument checking for posix_mknod(). (Derick) - Fixed initializing and argument checking for posix_mknod(). (Derick)
- Fixed bug #35229 (call_user_func() crashes when arguement_stack is nearly
full). (Dmitry)
- Fixed bug #35197 (Destructor is not called). (Tony) - Fixed bug #35197 (Destructor is not called). (Tony)
- Fixed bug #35179 (tokenizer extension needs T_HALT_COMPILER). (Greg) - Fixed bug #35179 (tokenizer extension needs T_HALT_COMPILER). (Greg)
- Fixed bug #35176 (include()/require()/*_once() produce wrong error messages - Fixed bug #35176 (include()/require()/*_once() produce wrong error messages

7
ext/standard/basic_functions.c

@ -2025,7 +2025,7 @@ PHP_FUNCTION(call_user_func)
params = safe_emalloc(sizeof(zval **), argc, 0); params = safe_emalloc(sizeof(zval **), argc, 0);
if (zend_get_parameters_array_ex(argc, params) == FAILURE) {
if (zend_get_parameters_array_ex(1, params) == FAILURE) {
efree(params); efree(params);
RETURN_FALSE; RETURN_FALSE;
} }
@ -2042,6 +2042,11 @@ PHP_FUNCTION(call_user_func)
RETURN_NULL(); RETURN_NULL();
} }
if (zend_get_parameters_array_ex(argc, params) == FAILURE) {
efree(params);
RETURN_FALSE;
}
if (call_user_function_ex(EG(function_table), NULL, *params[0], &retval_ptr, argc-1, params+1, 0, NULL TSRMLS_CC) == SUCCESS) { if (call_user_function_ex(EG(function_table), NULL, *params[0], &retval_ptr, argc-1, params+1, 0, NULL TSRMLS_CC) == SUCCESS) {
if (retval_ptr) { if (retval_ptr) {
COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr); COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr);

30
ext/standard/tests/general_functions/bug35229.phpt

@ -0,0 +1,30 @@
--TEST--
Bug #35229 (call_user_func() crashes when arguement_stack is nearly full)
--FILE--
<?php
class test2 {
static function use_stack() {
echo "OK\n";
}
}
function __autoload($class)
{
eval('class test1 extends test2 {}');
test1::use_stack(
1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30
);
}
call_user_func(array('test1', 'use_stack'),
1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30
);
?>
--EXPECT--
OK
OK
Loading…
Cancel
Save