Commit:    c4686b4de93a89e8265331b0d4a6a7954ccbae95
Author:    Dmitry Stogov <dmi...@zend.com>         Mon, 25 Mar 2013 15:07:27 
+0400
Parents:   66682f5abe27e7e53e088ec5d8268754912b5988
Branches:  PHP-5.3 PHP-5.4

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=c4686b4de93a89e8265331b0d4a6a7954ccbae95

Log:
Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle exceptions 
properly). (Jeff Welch)

Bugs:
https://bugs.php.net/63914

Changed paths:
  M  NEWS
  M  Zend/zend_vm_def.h
  M  Zend/zend_vm_execute.h


Diff:
diff --git a/NEWS b/NEWS
index d62e1a1..9d5fc6d 100644
--- a/NEWS
+++ b/NEWS
@@ -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 e8d3250..eed9245 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 f5cedd8..6edc91a 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);


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to