changeset 20015:680f59741e5e

doveconf, config: Free all memory at deinit
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 10 Apr 2016 14:39:22 +0300
parents b924e2e16783
children 6baa44f9f89c
files src/config/config-parser.c src/config/config-parser.h src/config/doveconf.c src/config/main.c
diffstat 4 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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);
+}
--- 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
--- 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;
 }
--- 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;
 }