From: Nikita Popov Date: Sun, 16 Sep 2018 11:42:00 +0000 (+0200) Subject: Perform final GC before the object store is freed X-Git-Tag: php-7.4.0alpha1~1906 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=178dcd47490f7d7842c6c412e2331ed160e55809;p=php Perform final GC before the object store is freed free_object_storage intentionally does not free the object allocations to make sure that they show up as leaks. However, if the object is in the GC root buffer, the later GC run may end up freeing the allocation, hiding the leak. Avoid this by moving the final GC run before free_object_storage, the way it was done before fast_shutdown was integrated into core. --- diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 57a7e80819..5b6012767c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -265,6 +265,16 @@ void shutdown_executor(void) /* {{{ */ zend_close_rsrc_list(&EG(regular_list)); } zend_end_try(); + if (!fast_shutdown) { + zend_hash_graceful_reverse_destroy(&EG(symbol_table)); + +#if ZEND_DEBUG + if (gc_enabled() && !CG(unclean_shutdown)) { + gc_collect_cycles(); + } +#endif + } + zend_objects_store_free_object_storage(&EG(objects_store), fast_shutdown); /* All resources and objects are destroyed. */ @@ -286,14 +296,6 @@ void shutdown_executor(void) /* {{{ */ zend_hash_discard(EG(class_table), EG(persistent_classes_count)); zend_cleanup_internal_classes(); } else { - zend_hash_graceful_reverse_destroy(&EG(symbol_table)); - -#if ZEND_DEBUG - if (gc_enabled() && !CG(unclean_shutdown)) { - gc_collect_cycles(); - } -#endif - /* remove error handlers before destroying classes and functions, * so that if handler used some class, crash would not happen */ if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {