From: Timo Sirainen Date: Thu, 1 Sep 2016 05:34:22 +0000 (+0300) Subject: lib-master: master_service_init_finish() now verifies that t_pop() wasn't leaked X-Git-Tag: 2.3.0.rc1~3088 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=28bf8f762fcd21c57bf71822cf818447babce9a0;p=thirdparty%2Fdovecot%2Fcore.git lib-master: master_service_init_finish() now verifies that t_pop() wasn't leaked --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index bb56568136..b8b6b1f466 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -34,6 +34,7 @@ struct master_service { ARRAY_TYPE(const_string) config_overrides; int config_fd; int syslog_facility; + data_stack_frame_t datastack_frame_id; struct master_service_listener *listeners; unsigned int socket_count; diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 0c5d355cd7..edbb2cb1ca 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -152,6 +152,7 @@ master_service_init(const char *name, enum master_service_flags flags, int *argc, char **argv[], const char *getopt_str) { struct master_service *service; + data_stack_frame_t datastack_frame_id = 0; unsigned int count; const char *value; @@ -186,7 +187,7 @@ master_service_init(const char *name, enum master_service_flags flags, before we get to ioloop. the corresponding t_pop() is in master_service_init_finish(). */ if ((flags & MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME) == 0) - t_push(NULL); + datastack_frame_id = t_push(NULL); /* ignore these signals as early as possible */ lib_signals_init(); @@ -210,6 +211,7 @@ master_service_init(const char *name, enum master_service_flags flags, service->ioloop = io_loop_create(); service->service_count_left = UINT_MAX; service->config_fd = -1; + service->datastack_frame_id = datastack_frame_id; service->config_path = i_strdup(getenv(MASTER_CONFIG_FILE_ENV)); if (service->config_path == NULL) @@ -532,8 +534,10 @@ void master_service_init_finish(struct master_service *service) master_status_update(service); /* close data stack frame opened by master_service_init() */ - if ((service->flags & MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME) == 0) - t_pop(); + if ((service->flags & MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME) == 0) { + if (t_pop() != service->datastack_frame_id) + i_panic("Leaked t_pop() call"); + } } void master_service_env_clean(void)