@@ -1188,6 +1188,17 @@ PHPAPI void php_html_puts(const char *str, size_t size)
1188
1188
}
1189
1189
/* }}} */
1190
1190
1191
+ static void clear_last_error () {
1192
+ if (PG (last_error_message )) {
1193
+ zend_string_release (PG (last_error_message ));
1194
+ PG (last_error_message ) = NULL ;
1195
+ }
1196
+ if (PG (last_error_file )) {
1197
+ free (PG (last_error_file ));
1198
+ PG (last_error_file ) = NULL ;
1199
+ }
1200
+ }
1201
+
1191
1202
/* {{{ php_error_cb
1192
1203
extended error handling function */
1193
1204
static ZEND_COLD void php_error_cb (int orig_type , const char * error_filename , const uint32_t error_lineno , zend_string * message )
@@ -1243,16 +1254,7 @@ static ZEND_COLD void php_error_cb(int orig_type, const char *error_filename, co
1243
1254
1244
1255
/* store the error if it has changed */
1245
1256
if (display ) {
1246
- if (PG (last_error_message )) {
1247
- zend_string * s = PG (last_error_message );
1248
- PG (last_error_message ) = NULL ;
1249
- zend_string_release (s );
1250
- }
1251
- if (PG (last_error_file )) {
1252
- char * s = PG (last_error_file );
1253
- PG (last_error_file ) = NULL ;
1254
- free (s );
1255
- }
1257
+ clear_last_error ();
1256
1258
if (!error_filename ) {
1257
1259
error_filename = "Unknown" ;
1258
1260
}
@@ -1587,14 +1589,7 @@ static zval *php_get_configuration_directive_for_zend(zend_string *name)
1587
1589
*/
1588
1590
static void php_free_request_globals (void )
1589
1591
{
1590
- if (PG (last_error_message )) {
1591
- zend_string_release (PG (last_error_message ));
1592
- PG (last_error_message ) = NULL ;
1593
- }
1594
- if (PG (last_error_file )) {
1595
- free (PG (last_error_file ));
1596
- PG (last_error_file ) = NULL ;
1597
- }
1592
+ clear_last_error ();
1598
1593
if (PG (php_sys_temp_dir )) {
1599
1594
efree (PG (php_sys_temp_dir ));
1600
1595
PG (php_sys_temp_dir ) = NULL ;
@@ -1876,12 +1871,12 @@ void php_request_shutdown(void *dummy)
1876
1871
}
1877
1872
} zend_end_try ();
1878
1873
1879
- /* 9. free request-bound globals */
1880
- php_free_request_globals ();
1881
-
1882
- /* 10. Shutdown scanner/executor/compiler and restore ini entries */
1874
+ /* 9. Shutdown scanner/executor/compiler and restore ini entries */
1883
1875
zend_deactivate ();
1884
1876
1877
+ /* 10. free request-bound globals */
1878
+ php_free_request_globals ();
1879
+
1885
1880
/* 11. Call all extensions post-RSHUTDOWN functions */
1886
1881
zend_try {
1887
1882
zend_post_deactivate_modules ();
@@ -1953,12 +1948,10 @@ static void core_globals_ctor(php_core_globals *core_globals)
1953
1948
*/
1954
1949
static void core_globals_dtor (php_core_globals * core_globals )
1955
1950
{
1956
- if (core_globals -> last_error_message ) {
1957
- zend_string_release (core_globals -> last_error_message );
1958
- }
1959
- if (core_globals -> last_error_file ) {
1960
- free (core_globals -> last_error_file );
1961
- }
1951
+ /* These should have been freed earlier. */
1952
+ ZEND_ASSERT (!core_globals -> last_error_message );
1953
+ ZEND_ASSERT (!core_globals -> last_error_file );
1954
+
1962
1955
if (core_globals -> disable_functions ) {
1963
1956
free (core_globals -> disable_functions );
1964
1957
}
@@ -2391,6 +2384,8 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
2391
2384
sapi_deactivate ();
2392
2385
module_startup = 0 ;
2393
2386
2387
+ /* Don't leak errors from startup into the per-request phase. */
2388
+ clear_last_error ();
2394
2389
shutdown_memory_manager (1 , 0 );
2395
2390
virtual_cwd_activate ();
2396
2391
0 commit comments