Skip to content

Commit c4686b4

Browse files
committed
Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle exceptions properly). (Jeff Welch)
1 parent 66682f5 commit c4686b4

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ PHP NEWS
55
- Core
66
. Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']).
77
(Anatol)
8+
. Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle
9+
exceptions properly). (Jeff Welch)
810
. Fixed bug #62343 (Show class_alias In get_declared_classes()) (Dmitry)
911

1012
- PCRE:

Zend/zend_vm_def.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,10 +2301,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
23012301
EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
23022302

23032303
if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
2304-
ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
2305-
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
2306-
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
2307-
23082304
if (EX(function_state).function->common.arg_info) {
23092305
zend_uint i=0;
23102306
zval **p = (zval**)EX(function_state).arguments;
@@ -2315,15 +2311,22 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
23152311
arg_count--;
23162312
}
23172313
}
2318-
if (!zend_execute_internal) {
2319-
/* saves one function call if zend_execute_internal is not used */
2320-
((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);
2321-
} else {
2322-
zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC);
2323-
}
23242314

2325-
if (!RETURN_VALUE_USED(opline)) {
2326-
zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
2315+
if (EXPECTED(EG(exception) == NULL)) {
2316+
ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
2317+
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
2318+
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
2319+
2320+
if (!zend_execute_internal) {
2321+
/* saves one function call if zend_execute_internal is not used */
2322+
((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);
2323+
} else {
2324+
zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC);
2325+
}
2326+
2327+
if (!RETURN_VALUE_USED(opline)) {
2328+
zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
2329+
}
23272330
}
23282331
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
23292332
EX(original_return_value) = EG(return_value_ptr_ptr);

Zend/zend_vm_execute.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,6 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
301301
EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
302302

303303
if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
304-
ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
305-
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
306-
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
307-
308304
if (EX(function_state).function->common.arg_info) {
309305
zend_uint i=0;
310306
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
315311
arg_count--;
316312
}
317313
}
318-
if (!zend_execute_internal) {
319-
/* saves one function call if zend_execute_internal is not used */
320-
((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);
321-
} else {
322-
zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
323-
}
324314

325-
if (!RETURN_VALUE_USED(opline)) {
326-
zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
315+
if (EXPECTED(EG(exception) == NULL)) {
316+
ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
317+
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
318+
EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
319+
320+
if (!zend_execute_internal) {
321+
/* saves one function call if zend_execute_internal is not used */
322+
((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);
323+
} else {
324+
zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
325+
}
326+
327+
if (!RETURN_VALUE_USED(opline)) {
328+
zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
329+
}
327330
}
328331
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
329332
EX(original_return_value) = EG(return_value_ptr_ptr);

0 commit comments

Comments
 (0)