# HG changeset patch # User Timo Sirainen # Date 1460288362 -10800 # Node ID 680f59741e5e55d347761f969ad5525c7d7358cf # Parent b924e2e16783497d8a279a8054641190fb2f72fc doveconf, config: Free all memory at deinit diff -r b924e2e16783 -r 680f59741e5e src/config/config-parser.c --- a/src/config/config-parser.c Wed Apr 06 14:45:01 2016 +0300 +++ b/src/config/config-parser.c Sun Apr 10 14:39:22 2016 +0300 @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ } 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 -r b924e2e16783 -r 680f59741e5e src/config/config-parser.h --- a/src/config/config-parser.h Wed Apr 06 14:45:01 2016 +0300 +++ b/src/config/config-parser.h Sun Apr 10 14:39:22 2016 +0300 @@ -28,5 +28,6 @@ const char *const *modules, const struct setting_parser_info *root) ATTR_NULL(2); +void config_parser_deinit(void); #endif diff -r b924e2e16783 -r 680f59741e5e src/config/doveconf.c --- a/src/config/doveconf.c Wed Apr 06 14:45:01 2016 +0300 +++ b/src/config/doveconf.c Sun Apr 10 14:39:22 2016 +0300 @@ -881,6 +881,7 @@ config_filter_deinit(&config_filter); module_dir_unload(&modules); + config_parser_deinit(); master_service_deinit(&master_service); return 0; } diff -r b924e2e16783 -r 680f59741e5e src/config/main.c --- a/src/config/main.c Wed Apr 06 14:45:01 2016 +0300 +++ b/src/config/main.c Sun Apr 10 14:39:22 2016 +0300 @@ -42,6 +42,7 @@ config_filter_deinit(&config_filter); module_dir_unload(&modules); + config_parser_deinit(); master_service_deinit(&master_service); return 0; }