mirror of
https://github.com/php/php-src.git
synced 2025-08-16 22:18:50 +02:00
Fixed bug #74164 (PHP hangs when an invalid value is dynamically passed to typehinted by-ref arg)
This commit is contained in:
parent
d1f36d6d8e
commit
36fcc4cb5d
3 changed files with 40 additions and 0 deletions
2
NEWS
2
NEWS
|
@ -3,6 +3,8 @@ PHP NEWS
|
||||||
?? ??? 2017, PHP 7.1.3
|
?? ??? 2017, PHP 7.1.3
|
||||||
|
|
||||||
- Core:
|
- Core:
|
||||||
|
. Fixed bug #74164 (PHP hangs when an invalid value is dynamically passed to
|
||||||
|
typehinted by-ref arg). (Laruence)
|
||||||
. Fixed bug #74093 (Maximum execution time of n+2 seconds exceed not written
|
. Fixed bug #74093 (Maximum execution time of n+2 seconds exceed not written
|
||||||
in error_log). (Laruence)
|
in error_log). (Laruence)
|
||||||
. Fixed bug #73989 (PHP 7.1 Segfaults within Symfony test suite).
|
. Fixed bug #73989 (PHP 7.1 Segfaults within Symfony test suite).
|
||||||
|
|
20
Zend/tests/bug74164.phpt
Normal file
20
Zend/tests/bug74164.phpt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #74164 (PHP hangs when an invalid value is dynamically passed to typehinted by-ref arg)
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Foo;
|
||||||
|
|
||||||
|
set_error_handler(function ($type, $msg) {
|
||||||
|
throw new \Exception($msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
call_user_func(function (array &$ref) {var_dump("xxx");}, 'not_an_array_variable');
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
Fatal error: Uncaught Exception: Parameter 1 to Foo\{closure}() expected to be a reference, value given in %sbug74164.php:%d
|
||||||
|
Stack trace:
|
||||||
|
#0 [internal function]: Foo\{closure}(%s)
|
||||||
|
#1 %sbug74164.php(%d): call_user_func(%s)
|
||||||
|
#2 {main}
|
||||||
|
thrown in %sbug74164.php on line %d
|
|
@ -761,6 +761,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
|
||||||
if (fci->object &&
|
if (fci->object &&
|
||||||
(!EG(objects_store).object_buckets ||
|
(!EG(objects_store).object_buckets ||
|
||||||
!IS_OBJ_VALID(EG(objects_store).object_buckets[fci->object->handle]))) {
|
!IS_OBJ_VALID(EG(objects_store).object_buckets[fci->object->handle]))) {
|
||||||
|
zend_vm_stack_free_call_frame(call);
|
||||||
if (EG(current_execute_data) == &dummy_execute_data) {
|
if (EG(current_execute_data) == &dummy_execute_data) {
|
||||||
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
|
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
|
||||||
}
|
}
|
||||||
|
@ -770,6 +771,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
|
||||||
if (func->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) {
|
if (func->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) {
|
||||||
if (func->common.fn_flags & ZEND_ACC_ABSTRACT) {
|
if (func->common.fn_flags & ZEND_ACC_ABSTRACT) {
|
||||||
zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
|
zend_throw_error(NULL, "Cannot call abstract method %s::%s()", ZSTR_VAL(func->common.scope->name), ZSTR_VAL(func->common.function_name));
|
||||||
|
zend_vm_stack_free_call_frame(call);
|
||||||
if (EG(current_execute_data) == &dummy_execute_data) {
|
if (EG(current_execute_data) == &dummy_execute_data) {
|
||||||
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
|
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
|
||||||
}
|
}
|
||||||
|
@ -780,6 +782,13 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
|
||||||
func->common.scope ? ZSTR_VAL(func->common.scope->name) : "",
|
func->common.scope ? ZSTR_VAL(func->common.scope->name) : "",
|
||||||
func->common.scope ? "::" : "",
|
func->common.scope ? "::" : "",
|
||||||
ZSTR_VAL(func->common.function_name));
|
ZSTR_VAL(func->common.function_name));
|
||||||
|
if (UNEXPECTED(EG(exception))) {
|
||||||
|
zend_vm_stack_free_call_frame(call);
|
||||||
|
if (EG(current_execute_data) == &dummy_execute_data) {
|
||||||
|
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
|
||||||
|
}
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -800,6 +809,15 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
|
||||||
func->common.scope ? ZSTR_VAL(func->common.scope->name) : "",
|
func->common.scope ? ZSTR_VAL(func->common.scope->name) : "",
|
||||||
func->common.scope ? "::" : "",
|
func->common.scope ? "::" : "",
|
||||||
ZSTR_VAL(func->common.function_name));
|
ZSTR_VAL(func->common.function_name));
|
||||||
|
if (UNEXPECTED(EG(exception))) {
|
||||||
|
ZEND_CALL_NUM_ARGS(call) = i;
|
||||||
|
zend_vm_stack_free_args(call);
|
||||||
|
zend_vm_stack_free_call_frame(call);
|
||||||
|
if (EG(current_execute_data) == &dummy_execute_data) {
|
||||||
|
EG(current_execute_data) = dummy_execute_data.prev_execute_data;
|
||||||
|
}
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue