summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rwxr-xr-xZend/tests/bug35437.phpt27
-rw-r--r--Zend/zend_vm_execute.h4
-rw-r--r--Zend/zend_vm_execute.skl4
4 files changed, 36 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 7629acc674..d1df4cfa6b 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,7 @@ PHP NEWS
connecting to 5.x server. (Andrey)
- Fixed bug #35496 (Crash in mcrypt_generic()/mdecrypt_generic() without
proper init). (Ilia)
+- Fixed bug #35437 (Segfault or Invalid Opcode 137/1/4). (Dmitry)
- Fixed bug #34729 (Crash in ZTS mode under Apache). (Dmitry, Zeev)
- Fixed bug #35470 (Assigning global using variable name from array doesn't
function). (Dmitry)
diff --git a/Zend/tests/bug35437.phpt b/Zend/tests/bug35437.phpt
new file mode 100755
index 0000000000..eecdee9683
--- /dev/null
+++ b/Zend/tests/bug35437.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #35437 Segfault or Invalid Opcode 137/1/4
+--FILE--
+<?php
+function err2exception($errno, $errstr)
+{
+ throw new Exception("Error occuried: " . $errstr);
+}
+
+set_error_handler('err2exception');
+
+class TestClass
+{
+ function testMethod()
+ {
+ $GLOBALS['t'] = new stdClass;
+ }
+}
+
+try {
+ TestClass::testMethod();
+} catch (Exception $e) {
+ echo "Catched: ".$e->getMessage()."\n";
+}
+?>
+--EXPECT--
+Catched: Error occuried: Non-static method TestClass::testMethod() should not be called statically
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index d87382402a..8abcb9d59c 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -36,6 +36,10 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
zend_execute_data execute_data;
+ if (EG(exception)) {
+ return;
+ }
+
/* Initialize execute_data */
EX(fbc) = NULL;
EX(object) = NULL;
diff --git a/Zend/zend_vm_execute.skl b/Zend/zend_vm_execute.skl
index 6cfd1bbcd3..9a3bd5038d 100644
--- a/Zend/zend_vm_execute.skl
+++ b/Zend/zend_vm_execute.skl
@@ -7,6 +7,10 @@ ZEND_API void {%EXECUTOR_NAME%}(zend_op_array *op_array TSRMLS_DC)
{%INTERNAL_LABELS%}
+ if (EG(exception)) {
+ return;
+ }
+
/* Initialize execute_data */
EX(fbc) = NULL;
EX(object) = NULL;