summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
Diffstat (limited to 'Zend')
-rw-r--r--Zend/tests/bug40815.phpt18
-rw-r--r--Zend/zend.c3
-rw-r--r--Zend/zend_execute_API.c2
3 files changed, 22 insertions, 1 deletions
diff --git a/Zend/tests/bug40815.phpt b/Zend/tests/bug40815.phpt
new file mode 100644
index 0000000000..6f7477a9eb
--- /dev/null
+++ b/Zend/tests/bug40815.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Bug #40815 (using strings like "class::func" and static methods in set_exception_handler() might result in crash).
+--FILE--
+<?php
+
+class ehandle{
+ static public function exh ($ex) {
+ echo 'foo';
+ }
+}
+
+set_exception_handler("ehandle::exh");
+
+throw new Exception ("Whiii");
+echo "Done\n";
+?>
+--EXPECTF--
+foo
diff --git a/Zend/zend.c b/Zend/zend.c
index 87342e2a46..88601eab4e 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -1146,6 +1146,9 @@ ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_co
zval_ptr_dtor(&retval2);
}
} else {
+ if (!EG(exception)) {
+ EG(exception) = old_exception;
+ }
zend_exception_error(EG(exception) TSRMLS_CC);
}
efree(params);
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 95efb309e8..2fb02c421a 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -750,7 +750,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
fname = Z_STRVAL_P(fci->function_name);
fname_len = Z_STRLEN_P(fci->function_name);
- if (calling_scope && (colon = strstr(fname, "::")) != NULL) {
+ if ((colon = strstr(fname, "::")) != NULL) {
int clen = colon - fname;
int mlen = fname_len - clen - 2;
zend_class_entry **pce, *ce_child = NULL;