From 4f290b892de4c12d790f60428ae421e36ea3ea7e Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 13 Jun 2018 00:58:55 +0300 Subject: [PATCH] lib-master: Allow calling master_service_deinit() without _init_finish() --- src/lib-master/master-service-private.h | 1 + src/lib-master/master-service.c | 8 ++++++++ 2 files changed, 9 insertions(+) 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);