From: Timo Sirainen Date: Tue, 12 Jun 2018 21:58:55 +0000 (+0300) Subject: lib-master: Allow calling master_service_deinit() without _init_finish() X-Git-Tag: 2.3.9~1719 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2142656f0382cc4461a621eef9f29508072accd7;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Allow calling master_service_deinit() without _init_finish() --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index 66483df7b7..33dba32aa2 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -86,6 +86,7 @@ struct master_service { bool config_path_from_master:1; bool log_initialized:1; bool ssl_module_loaded:1; + bool init_finished:1; }; void master_service_io_listeners_add(struct master_service *service); diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 05cd4d18b5..2e1914e22b 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -582,6 +582,9 @@ void master_service_init_finish(struct master_service *service) enum libsig_flags sigint_flags = LIBSIG_FLAG_DELAYED; struct stat st; + i_assert(!service->init_finished); + service->init_finished = TRUE; + /* set default signal handlers */ if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) sigint_flags |= LIBSIG_FLAG_RESTART; @@ -995,6 +998,11 @@ void master_service_deinit(struct master_service **_service) *_service = NULL; + if (!service->init_finished && + (service->flags & MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME) == 0) { + if (!t_pop(&service->datastack_frame_id)) + i_panic("Leaked t_pop() call"); + } master_service_haproxy_abort(service); master_service_io_listeners_remove(service);