]> granicus.if.org Git - php/commitdiff
Fixed bug #43175 (__destruct() throwing an exception with __call() causes segfault)
authorDmitry Stogov <dmitry@php.net>
Tue, 6 Nov 2007 14:56:32 +0000 (14:56 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 6 Nov 2007 14:56:32 +0000 (14:56 +0000)
Zend/tests/bug43175.phpt [new file with mode: 0755]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/bug43175.phpt b/Zend/tests/bug43175.phpt
new file mode 100755 (executable)
index 0000000..3bf6bef
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Bug #43175 (__destruct() throwing an exception with __call() causes segfault)
+--FILE--
+<?php
+
+class foobar {
+    public function __destruct() {
+        throw new Exception();
+    }
+    public function __call($m, $a) {
+        return $this;
+    }
+}
+function foobar() {
+    return new foobar();
+}
+try {
+    foobar()->unknown();
+} catch (Exception $e) {
+    echo "__call via traditional factory should be caught\n";
+}
+?>
+--EXPECT--
+__call via traditional factory should be caught
index ddc059deb31a922853549256d3589ad4e7100230..16e1e7cc925e60e9f65d5b3374b7e580d90c9f19 100644 (file)
@@ -2167,6 +2167,9 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                }
        }
 
+       EX(function_state).function = (zend_function *) EX(op_array);
+       EG(function_state_ptr) = &EX(function_state);
+
        if (EG(This)) {
                if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
                        if (IS_CTOR_USED(EX(called_scope))) {
@@ -2190,8 +2193,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                EG(called_scope) = current_called_scope;
        }
 
-       EX(function_state).function = (zend_function *) EX(op_array);
-       EG(function_state_ptr) = &EX(function_state);
        zend_ptr_stack_clear_multiple(TSRMLS_C);
 
        if (EG(exception)) {
index 15edae4b4a55b18d54e30982a03b43d706ee993d..cc22f5de17d99153077b9a533c568b01a082975a 100644 (file)
@@ -283,6 +283,9 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                }
        }
 
+       EX(function_state).function = (zend_function *) EX(op_array);
+       EG(function_state_ptr) = &EX(function_state);
+
        if (EG(This)) {
                if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
                        if (IS_CTOR_USED(EX(called_scope))) {
@@ -306,8 +309,6 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
                EG(called_scope) = current_called_scope;
        }
 
-       EX(function_state).function = (zend_function *) EX(op_array);
-       EG(function_state_ptr) = &EX(function_state);
        zend_ptr_stack_clear_multiple(TSRMLS_C);
 
        if (EG(exception)) {