]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Allow calling master_service_deinit() without _init_finish()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 12 Jun 2018 21:58:55 +0000 (00:58 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 12 Jun 2018 21:58:55 +0000 (00:58 +0300)
src/lib-master/master-service-private.h
src/lib-master/master-service.c

index 66483df7b77192837e2e13914b3606a2a95e44d8..33dba32aa2de97b36b48bbde5bb1627878085472 100644 (file)
@@ -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);
index 05cd4d18b58e6e1965420cf4da968e9d6fe0f389..2e1914e22b435722edc54e994191fd7dac62d874 100644 (file)
@@ -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);