changeset 447:097bae83b07a

Forgot to cleanup the configuration on exit, spotted by valgrind
author Sebastien Decugis <sdecugis@nict.go.jp>
date Thu, 29 Jul 2010 11:36:40 +0900
parents 66f58cecf3cd
children 9493b8d8a35f
files freeDiameter/apps.c freeDiameter/config.c freeDiameter/fD.h freeDiameter/main.c include/freeDiameter/freeDiameter.h
diffstat 5 files changed, 55 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/freeDiameter/apps.c	Thu Jul 29 10:38:39 2010 +0900
+++ b/freeDiameter/apps.c	Thu Jul 29 11:36:40 2010 +0900
@@ -135,3 +135,18 @@
 	*common_found = 0;
 	return 0;
 }
+
+/* Remove the apps from a list */
+int fd_app_empty(struct fd_list * list)
+{
+	TRACE_ENTRY("%p", list);
+	CHECK_PARAMS( list );
+	
+	while (!FD_IS_LIST_EMPTY(list)) {
+		struct fd_list * li = list->next;
+		fd_list_unlink(li);
+		free(li);
+	}
+	
+	return 0;
+}
--- a/freeDiameter/config.c	Thu Jul 29 10:38:39 2010 +0900
+++ b/freeDiameter/config.c	Thu Jul 29 11:36:40 2010 +0900
@@ -270,3 +270,39 @@
 	
 	return 0;
 }
+
+
+/* Destroy contents of fd_g_config structure */
+int fd_conf_deinit()
+{
+	TRACE_ENTRY();
+	
+	/* Free the TLS parameters */
+	gnutls_priority_deinit(fd_g_config->cnf_sec_data.prio_cache);
+	gnutls_dh_params_deinit(fd_g_config->cnf_sec_data.dh_cache);
+	gnutls_certificate_free_credentials(fd_g_config->cnf_sec_data.credentials);
+	
+	free(fd_g_config->cnf_sec_data.cert_file); fd_g_config->cnf_sec_data.cert_file = NULL;
+	free(fd_g_config->cnf_sec_data.key_file); fd_g_config->cnf_sec_data.key_file = NULL;
+	free(fd_g_config->cnf_sec_data.ca_file); fd_g_config->cnf_sec_data.ca_file = NULL;
+	free(fd_g_config->cnf_sec_data.crl_file); fd_g_config->cnf_sec_data.crl_file = NULL;
+	free(fd_g_config->cnf_sec_data.prio_string); fd_g_config->cnf_sec_data.prio_string = NULL;
+	
+	/* Destroy dictionary */
+	CHECK_FCT_DO( fd_dict_fini(&fd_g_config->cnf_dict), );
+	
+	/* Destroy the main event queue */
+	CHECK_FCT_DO( fd_fifo_del(&fd_g_config->cnf_main_ev), );
+	
+	/* Destroy the local endpoints and applications */
+	CHECK_FCT_DO(fd_ep_filter(&fd_g_config->cnf_endpoints, 0 ), );
+	CHECK_FCT_DO(fd_app_empty(&fd_g_config->cnf_apps ), );
+	
+	/* Destroy the local identity */	
+	free(fd_g_config->cnf_diamid); fd_g_config->cnf_diamid = NULL;
+	free(fd_g_config->cnf_diamrlm); fd_g_config->cnf_diamrlm = NULL;
+	
+	return 0;
+}
+
+
--- a/freeDiameter/fD.h	Thu Jul 29 10:38:39 2010 +0900
+++ b/freeDiameter/fD.h	Thu Jul 29 11:36:40 2010 +0900
@@ -79,6 +79,7 @@
 
 /* Configuration */
 int fd_conf_init();
+int fd_conf_deinit();
 void fd_conf_dump();
 int fd_conf_parse();
 int fddparse(struct fd_config * conf); /* yacc generated */
--- a/freeDiameter/main.c	Thu Jul 29 10:38:39 2010 +0900
+++ b/freeDiameter/main.c	Thu Jul 29 11:36:40 2010 +0900
@@ -169,6 +169,8 @@
 	
 	GNUTLS_TRACE( gnutls_global_deinit() );
 	
+	CHECK_FCT_DO( fd_conf_deinit(), );
+	
 	fd_log_debug(FD_PROJECT_BINARY " daemon is terminated.\n");
 	
 	fd_lib_fini();
--- a/include/freeDiameter/freeDiameter.h	Thu Jul 29 10:38:39 2010 +0900
+++ b/include/freeDiameter/freeDiameter.h	Thu Jul 29 11:36:40 2010 +0900
@@ -725,5 +725,6 @@
 int fd_app_merge(struct fd_list * list, application_id_t aid, vendor_id_t vid, int auth, int acct);
 int fd_app_check(struct fd_list * list, application_id_t aid, struct fd_app **detail);
 int fd_app_check_common(struct fd_list * list1, struct fd_list * list2, int * common_found);
+int fd_app_empty(struct fd_list * list);
 
 #endif /* _FREEDIAMETER_H */
"Welcome to our mercurial repository"