diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c index a8ce1eb5c05..a60428ee04f 100644 --- a/Zend/zend_observer.c +++ b/Zend/zend_observer.c @@ -220,7 +220,11 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_end( first_observed_frame = NULL; current_observed_frame = NULL; } else { - current_observed_frame = execute_data->prev_execute_data; + zend_execute_data *ex = execute_data->prev_execute_data; + while (ex && !ex->func) { + ex = ex->prev_execute_data; + } + current_observed_frame = ex; } } @@ -228,7 +232,7 @@ ZEND_API void zend_observer_fcall_end_all(void) { zend_execute_data *ex = current_observed_frame; while (ex != NULL) { - if (ex->func->type != ZEND_INTERNAL_FUNCTION) { + if (ex->func && ex->func->type != ZEND_INTERNAL_FUNCTION) { zend_observer_fcall_end(ex, NULL); } ex = ex->prev_execute_data; diff --git a/ext/zend_test/tests/observer_error_05.phpt b/ext/zend_test/tests/observer_error_05.phpt new file mode 100644 index 00000000000..d3e5f67a4ed --- /dev/null +++ b/ext/zend_test/tests/observer_error_05.phpt @@ -0,0 +1,35 @@ +--TEST-- +Observer: End handlers fire after a userland fatal error +--SKIPIF-- + +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- + +--EXPECTF-- + + + + + + <{closure}> + +Fatal error: Foo error in %s on line %d + + +