@@ -217,6 +217,9 @@ static void (*old_zend_execute_internal)(zend_execute_data *execute_data_ptr, zv
217217#endif
218218
219219static void (* old_zend_error_cb )(MEMPROF_ZEND_ERROR_CB_ARGS );
220+ static void (* rinit_zend_error_cb )(MEMPROF_ZEND_ERROR_CB_ARGS );
221+ static zend_bool zend_error_cb_overridden ;
222+ static void memprof_zend_error_cb (MEMPROF_ZEND_ERROR_CB_ARGS );
220223
221224static PHP_INI_MH ((* origOnChangeMemoryLimit )) = NULL ;
222225
@@ -718,8 +721,20 @@ static void * zend_realloc_handler(void * ptr, size_t size)
718721 return result ;
719722}
720723
724+ // Some extensions override zend_error_cb and don't call the previous
725+ // zend_error_cb, so memprof needs to be the last to override it
726+ static void memprof_late_override_error_cb () {
727+ old_zend_error_cb = zend_error_cb ;
728+ zend_error_cb = memprof_zend_error_cb ;
729+ zend_error_cb_overridden = 1 ;
730+ }
731+
721732static void memprof_zend_execute (zend_execute_data * execute_data )
722733{
734+ if (UNEXPECTED (!zend_error_cb_overridden )) {
735+ memprof_late_override_error_cb ();
736+ }
737+
723738 WITHOUT_MALLOC_TRACKING {
724739
725740 current_frame = get_or_create_frame (execute_data , current_frame );
@@ -740,6 +755,10 @@ static void memprof_zend_execute_internal(zend_execute_data *execute_data_ptr, z
740755{
741756 int ignore = 0 ;
742757
758+ if (UNEXPECTED (!zend_error_cb_overridden )) {
759+ memprof_late_override_error_cb ();
760+ }
761+
743762 if (& execute_data_ptr -> func -> internal_function == & zend_pass_function ) {
744763 ignore = 1 ;
745764 } else if (execute_data_ptr -> func -> common .function_name ) {
@@ -1191,9 +1210,6 @@ PHP_MINIT_FUNCTION(memprof)
11911210 }
11921211 }
11931212
1194- old_zend_error_cb = zend_error_cb ;
1195- zend_error_cb = memprof_zend_error_cb ;
1196-
11971213 return SUCCESS ;
11981214}
11991215/* }}} */
@@ -1231,6 +1247,9 @@ PHP_RINIT_FUNCTION(memprof)
12311247 memprof_enable (& MEMPROF_G (profile_flags ));
12321248 }
12331249
1250+ rinit_zend_error_cb = zend_error_cb ;
1251+ zend_error_cb_overridden = 0 ;
1252+
12341253 return SUCCESS ;
12351254}
12361255/* }}} */
@@ -1243,6 +1262,8 @@ PHP_RSHUTDOWN_FUNCTION(memprof)
12431262 memprof_disable ();
12441263 }
12451264
1265+ zend_error_cb = rinit_zend_error_cb ;
1266+
12461267 return SUCCESS ;
12471268}
12481269/* }}} */
0 commit comments