diff options
author | Dmitry Stogov <dmitry@zend.com> | 2013-03-25 15:07:27 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2013-03-25 15:07:27 +0400 |
commit | c4686b4de93a89e8265331b0d4a6a7954ccbae95 (patch) | |
tree | 61ad38db45849fe82e87b9f60a8f1b5947054b5c | |
parent | 66682f5abe27e7e53e088ec5d8268754912b5988 (diff) | |
download | php-git-c4686b4de93a89e8265331b0d4a6a7954ccbae95.tar.gz |
Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle exceptions properly). (Jeff Welch)
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 27 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 27 |
3 files changed, 32 insertions, 24 deletions
@@ -5,6 +5,8 @@ PHP NEWS - Core . Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']). (Anatol) + . Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle + exceptions properly). (Jeff Welch) . Fixed bug #62343 (Show class_alias In get_declared_classes()) (Dmitry) - PCRE: diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e8d3250d0d..eed924518e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2301,10 +2301,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY) EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC); if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) { - ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); - EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference; - if (EX(function_state).function->common.arg_info) { zend_uint i=0; zval **p = (zval**)EX(function_state).arguments; @@ -2315,15 +2311,22 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY) arg_count--; } } - if (!zend_execute_internal) { - /* saves one function call if zend_execute_internal is not used */ - ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); - } else { - zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC); - } - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + if (EXPECTED(EG(exception) == NULL)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); + EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; + EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference; + + if (!zend_execute_internal) { + /* saves one function call if zend_execute_internal is not used */ + ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); + } else { + zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC); + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) { EX(original_return_value) = EG(return_value_ptr_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f5cedd872f..6edc91a742 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -301,10 +301,6 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC); if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) { - ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); - EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference; - if (EX(function_state).function->common.arg_info) { zend_uint i=0; zval **p = (zval**)EX(function_state).arguments; @@ -315,15 +311,22 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR arg_count--; } } - if (!zend_execute_internal) { - /* saves one function call if zend_execute_internal is not used */ - ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); - } else { - zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC); - } - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + if (EXPECTED(EG(exception) == NULL)) { + ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); + EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; + EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference; + + if (!zend_execute_internal) { + /* saves one function call if zend_execute_internal is not used */ + ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC); + } else { + zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC); + } + + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) { EX(original_return_value) = EG(return_value_ptr_ptr); |