cvs: ZendEngine2 / zend_vm_def.h zend_vm_execute.h /tests bug45805.phpt
"Dmitry Stogov" <[email protected]>
| Newsgroups | gmane.comp.php.cvs.zend |
|---|---|
| Message-ID | <cvsdmitry1218612160@cvsserver> |
dmitry Wed Aug 13 07:22:40 2008 UTC
Modified files:
/ZendEngine2 zend_vm_def.h zend_vm_execute.h
/ZendEngine2/tests bug45805.phpt
Log:
Fixed bug #45805 (Crach on throwing exception from error handler)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.242&r2=1.243&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.242 ZendEngine2/zend_vm_def.h:1.243
--- ZendEngine2/zend_vm_def.h:1.242 Sun Aug 10 22:45:47 2008
+++ ZendEngine2/zend_vm_def.h Wed Aug 13 07:22:39 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.242 2008/08/10 22:45:47 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.243 2008/08/13 07:22:39 dmitry Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -1664,6 +1664,10 @@
PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ FREE_OP2_VAR_PTR();
+ ZEND_VM_NEXT_OPCODE();
+ }
ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN);
} else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(*value_ptr_ptr);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.246&r2=1.247&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.246 ZendEngine2/zend_vm_execute.h:1.247
--- ZendEngine2/zend_vm_execute.h:1.246 Sun Aug 10 22:45:47 2008
+++ ZendEngine2/zend_vm_execute.h Wed Aug 13 07:22:39 2008
@@ -14442,6 +14442,10 @@
PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ ZEND_VM_NEXT_OPCODE();
+ }
return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(*value_ptr_ptr);
@@ -16952,6 +16956,10 @@
PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
+ if (UNEXPECTED(EG(exception) != NULL)) {
+
+ ZEND_VM_NEXT_OPCODE();
+ }
return ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(*value_ptr_ptr);
@@ -28641,6 +28649,10 @@
PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+ ZEND_VM_NEXT_OPCODE();
+ }
return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(*value_ptr_ptr);
@@ -30916,6 +30928,10 @@
PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
}
zend_error(E_STRICT, "Only variables should be assigned by reference");
+ if (UNEXPECTED(EG(exception) != NULL)) {
+
+ ZEND_VM_NEXT_OPCODE();
+ }
return ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
PZVAL_LOCK(*value_ptr_ptr);
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug45805.phpt?r1=1.1&r2=1.2&diff_format=u
Index: ZendEngine2/tests/bug45805.phpt
diff -u /dev/null ZendEngine2/tests/bug45805.phpt:1.2
--- /dev/null Wed Aug 13 07:22:40 2008
+++ ZendEngine2/tests/bug45805.phpt Wed Aug 13 07:22:40 2008
@@ -0,0 +1,46 @@
+--TEST--
+Bug #45805 (Crach on throwing exception from error handler)
+--FILE--
+<?php
+class PHPUnit_Util_ErrorHandler
+{
+ public static function handleError($errno, $errstr, $errfile, $errline)
+ {
+ throw new RuntimeException;
+ }
+}
+
+class A {
+ public function getX() {
+ return NULL;
+ }
+}
+
+class B {
+ public function foo() {
+ $obj = new A;
+ $source = &$obj->getX();
+ }
+
+ public function bar() {
+ $m = new ReflectionMethod('B', 'foo');
+ $m->invoke($this);
+ }
+}
+
+set_error_handler(
+ array('PHPUnit_Util_ErrorHandler', 'handleError'), E_ALL | E_STRICT
+);
+
+$o = new B;
+$o->bar();
+?>
+--EXPECTF--
+Fatal error: Uncaught exception 'RuntimeException' in %sbug45805.php:%d
+Stack trace:
+#0 %sbug45805.php(%d): PHPUnit_Util_ErrorHandler::handleError(2048, 'Only variables ...', '%s', %d, Array)
+#1 [internal function]: B->foo()
+#2 %sbug45805.php(%d): ReflectionMethod->invoke(Object(B))
+#3 %sbug45805.php(%d): B->bar()
+#4 {main}
+ thrown in %sbug45805.php on line %d
--
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php