From: Timo Sirainen Date: Sun, 10 Apr 2016 11:39:22 +0000 (+0300) Subject: doveconf, config: Free all memory at deinit X-Git-Tag: 2.2.24~71 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6347bb65e93c27f1bf4330786447c9ab0cab4dbf;p=thirdparty%2Fdovecot%2Fcore.git doveconf, config: Free all memory at deinit --- diff --git a/src/config/config-parser.c b/src/config/config-parser.c index cb7910d8fe..fa779c623d 100644 --- a/src/config/config-parser.c +++ b/src/config/config-parser.c @@ -31,6 +31,8 @@ #define DNS_LOOKUP_TIMEOUT_SECS 30 #define DNS_LOOKUP_WARN_SECS 5 +ARRAY_DEFINE_TYPE(setting_parser_info_p, const struct setting_parser_info *); + static const enum settings_parser_flags settings_parser_flags = SETTINGS_PARSER_FLAG_IGNORE_UNKNOWN_KEYS | SETTINGS_PARSER_FLAG_TRACK_CHANGES; @@ -42,6 +44,9 @@ void (*hook_config_parser_begin)(struct config_parser_context *ctx); int (*hook_config_parser_end)(struct config_parser_context *ctx, const char **error_r); +static ARRAY_TYPE(service_settings) services_free_at_deinit = ARRAY_INIT; +static ARRAY_TYPE(setting_parser_info_p) roots_free_at_deinit = ARRAY_INIT; + static const char *info_type_name_find(const struct setting_parser_info *info) { unsigned int i; @@ -1007,7 +1012,7 @@ void config_parse_load_modules(void) struct module_dir_load_settings mod_set; struct module *m; const struct setting_parser_info **roots; - ARRAY(const struct setting_parser_info *) new_roots; + ARRAY_TYPE(setting_parser_info_p) new_roots; ARRAY_TYPE(service_settings) new_services; struct service_settings *const *services, *service_set; unsigned int i, count; @@ -1046,6 +1051,9 @@ void config_parse_load_modules(void) array_append(&new_roots, &all_roots[i], 1); array_append_zero(&new_roots); all_roots = array_idx(&new_roots, 0); + roots_free_at_deinit = new_roots; + } else { + array_free(&new_roots); } if (array_count(&new_services) > 0) { /* module added new services. update the defaults. */ @@ -1053,6 +1061,9 @@ void config_parse_load_modules(void) for (i = 0; i < count; i++) array_append(&new_services, &services[i], 1); *default_services = new_services; + services_free_at_deinit = new_services; + } else { + array_free(&new_services); } } @@ -1102,3 +1113,11 @@ bool config_module_want_parser(struct config_module_parser *parsers, } return FALSE; } + +void config_parser_deinit(void) +{ + if (array_is_created(&services_free_at_deinit)) + array_free(&services_free_at_deinit); + if (array_is_created(&roots_free_at_deinit)) + array_free(&roots_free_at_deinit); +} diff --git a/src/config/config-parser.h b/src/config/config-parser.h index 98cb9cb585..e0a0a5bea3 100644 --- a/src/config/config-parser.h +++ b/src/config/config-parser.h @@ -28,5 +28,6 @@ bool config_module_want_parser(struct config_module_parser *parsers, const char *const *modules, const struct setting_parser_info *root) ATTR_NULL(2); +void config_parser_deinit(void); #endif diff --git a/src/config/doveconf.c b/src/config/doveconf.c index 1df9201de2..095a78840f 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -881,6 +881,7 @@ int main(int argc, char *argv[]) config_filter_deinit(&config_filter); module_dir_unload(&modules); + config_parser_deinit(); master_service_deinit(&master_service); return 0; } diff --git a/src/config/main.c b/src/config/main.c index c5ccc52b24..2a44731cda 100644 --- a/src/config/main.c +++ b/src/config/main.c @@ -42,6 +42,7 @@ int main(int argc, char *argv[]) config_filter_deinit(&config_filter); module_dir_unload(&modules); + config_parser_deinit(); master_service_deinit(&master_service); return 0; }