diff -r ef3c8a0e1fee -r 96d2ba2f28db src/server/daemon/config.c --- a/src/server/daemon/config.c Sun Nov 27 13:33:30 2022 +0100 +++ b/src/server/daemon/config.c Sun Nov 27 15:58:37 2022 +0100 @@ -353,6 +353,9 @@ } int migrate_server_conf(ServerConfiguration *old_cfg, ServerConfiguration *new_cfg) { + old_cfg->next = new_cfg; + cfg_ref(new_cfg); // new cfg should not be freed until old cfg is freed + // compare old/new listeners and set next listener, if they are using // the same socket CxIterator old_listeners = cxListIterator(old_cfg->listeners, 0); @@ -360,11 +363,11 @@ if(oldls->next) { continue; } - + CxIterator new_listeners = cxListIterator(new_cfg->listeners, 0); cx_foreach(HttpListener*, newls, new_listeners) { if(http_listener_socket_eq(oldls, newls)) { - oldls->next = newls; + http_listener_set_next(oldls, newls); break; } } @@ -380,6 +383,10 @@ void cfg_unref(ServerConfiguration *cfg) { uint32_t ref = ws_atomic_dec32(&cfg->ref); if(ref == 0) { + if(cfg->next) { + cfg_unref(cfg->next); + } + log_ereport(LOG_VERBOSE, "destroy configuration %p", cfg); pool_destroy(cfg->pool); } }