diff --git a/ext/zend_test/observer.c b/ext/zend_test/observer.c index d413450bf9dec..ff3b444b610f4 100644 --- a/ext/zend_test/observer.c +++ b/ext/zend_test/observer.c @@ -304,9 +304,12 @@ static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList) zend_array **p = (zend_array **) ZEND_INI_GET_ADDR(); zend_string *funcname; zend_function *func; + if (!ZT_G(observer_enabled)) { + return FAILURE; + } if (stage != PHP_INI_STAGE_STARTUP && stage != PHP_INI_STAGE_ACTIVATE && stage != PHP_INI_STAGE_DEACTIVATE && stage != PHP_INI_STAGE_SHUTDOWN) { ZEND_HASH_FOREACH_STR_KEY(*p, funcname) { - if ((func = zend_hash_find_ptr(EG(function_table), funcname))) { + if ((func = zend_hash_find_ptr(EG(function_table), funcname)) && ZEND_OBSERVER_DATA(func) != NULL) { void *old_handler; zend_observer_remove_begin_handler(func, observer_begin, (zend_observer_fcall_begin_handler *)&old_handler); zend_observer_remove_end_handler(func, observer_end, (zend_observer_fcall_end_handler *)&old_handler); @@ -329,7 +332,7 @@ static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList) zend_string_release(str); if (stage != PHP_INI_STAGE_STARTUP && stage != PHP_INI_STAGE_ACTIVATE && stage != PHP_INI_STAGE_DEACTIVATE && stage != PHP_INI_STAGE_SHUTDOWN) { ZEND_HASH_FOREACH_STR_KEY(*p, funcname) { - if ((func = zend_hash_find_ptr(EG(function_table), funcname))) { + if ((func = zend_hash_find_ptr(EG(function_table), funcname)) && ZEND_OBSERVER_DATA(func) != NULL) { zend_observer_add_begin_handler(func, observer_begin); zend_observer_add_end_handler(func, observer_end); } diff --git a/ext/zend_test/tests/gh16414.phpt b/ext/zend_test/tests/gh16414.phpt new file mode 100644 index 0000000000000..ee1f406ebc08e --- /dev/null +++ b/ext/zend_test/tests/gh16414.phpt @@ -0,0 +1,13 @@ +--TEST-- +GH-16414 (zend_test.observer.observe_function_names may segfault) +--EXTENSIONS-- +zend_test +--INI-- +zend_test.observer.enabled=0 +--FILE-- + +--EXPECT-- +bool(false)