@@ -2411,6 +2411,8 @@ static void free_interface_lib() {
24112411 }
24122412 uploaded_files_last_query_num--;
24132413 }
2414+ OnKphpWarningCallback::get ().reset ();
2415+ vk::singleton<OomHandler>::get ().reset ();
24142416 dl::leave_critical_section ();
24152417}
24162418
@@ -2432,16 +2434,12 @@ static void free_runtime_libs() {
24322434 free_udp_lib ();
24332435 free_tcp_lib ();
24342436 free_timelib ();
2435- OnKphpWarningCallback::get ().reset ();
24362437 kphp_tracing::free_tracing_lib ();
24372438 free_slot_factories ();
24382439 runtime_builtins_stats::reset_request_stats ();
24392440
24402441 free_job_client_interface_lib ();
24412442 free_job_server_interface_lib ();
2442-
2443- free_confdata_functions_lib ();
2444- free_instance_cache_lib ();
24452443 free_kphp_backtrace ();
24462444
24472445 free_use_updated_gmmktime ();
@@ -2455,8 +2453,14 @@ static void free_runtime_libs() {
24552453#endif
24562454 vk::singleton<database_drivers::Adaptor>::get ().reset ();
24572455 vk::singleton<curl_async::CurlAdaptor>::get ().reset ();
2458- vk::singleton<OomHandler>::get ().reset ();
24592456 hard_reset_var (SerializationLibContext::get ().last_json_processor_error );
2457+
2458+ // Confdata and InstanceCache MUST be freed at the very end
2459+ // They call force_destroy() on runtime primitives inside, which forcibly sets refcnt to zero
2460+ // It may lead to double free if someone tries to destroy such primitives after it
2461+ // (e.g. in case of destroying saved callbacks capturing objects from InstanceCache or Confdata)
2462+ free_confdata_functions_lib ();
2463+ free_instance_cache_lib ();
24602464}
24612465
24622466void global_init_runtime_libs () {
0 commit comments