From: Richard Mudgett Date: Thu, 13 Jun 2013 18:47:48 +0000 (+0000) Subject: app_confbridge: Fix memory leak on reload. X-Git-Tag: 11.6.0-rc1~3^2~92 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=365e81053bf3a847c8a597523ec4df61e96f23ae;p=thirdparty%2Fasterisk.git app_confbridge: Fix memory leak on reload. The config framework options should not be registered multiple times. Instead the configuration just needs to be reprocessed by the config framework. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@391700 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index 73af5a0abb..57de6d46cf 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -3098,7 +3098,7 @@ static int load_module(void) { int res = 0; - if (conf_load_config(0)) { + if (conf_load_config()) { ast_log(LOG_ERROR, "Unable to load config. Not loading module.\n"); return AST_MODULE_LOAD_DECLINE; } @@ -3145,7 +3145,7 @@ static int load_module(void) static int reload(void) { - return conf_load_config(1); + return conf_reload_config(); } AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Conference Bridge Application", diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index 57166aa8c9..9244a42e05 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -1320,12 +1320,10 @@ static int verify_default_profiles(void) return 0; } -int conf_load_config(int reload) +int conf_load_config(void) { - if (!reload) { - if (aco_info_init(&cfg_info)) { - return -1; - } + if (aco_info_init(&cfg_info)) { + return -1; } /* User options */ @@ -1373,23 +1371,29 @@ int conf_load_config(int reload) /* Menu options */ aco_option_register_custom(&cfg_info, "^[0-9A-D*#]+$", ACO_REGEX, menu_types, NULL, menu_option_handler, 0); - if (aco_process_config(&cfg_info, reload) == ACO_PROCESS_ERROR) { + if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) { goto error; } - if (!reload && ast_cli_register_multiple(cli_confbridge_parser, ARRAY_LEN(cli_confbridge_parser))) { + if (ast_cli_register_multiple(cli_confbridge_parser, ARRAY_LEN(cli_confbridge_parser))) { goto error; } return 0; error: - /* On a reload, just keep the config we already have in place. */ - if (!reload) { - conf_destroy_config(); - } + conf_destroy_config(); return -1; } +int conf_reload_config(void) +{ + if (aco_process_config(&cfg_info, 1) == ACO_PROCESS_ERROR) { + /* On a reload, just keep the config we already have in place. */ + return -1; + } + return 0; +} + static void conf_user_profile_copy(struct user_profile *dst, struct user_profile *src) { *dst = *src; diff --git a/apps/confbridge/include/confbridge.h b/apps/confbridge/include/confbridge.h index 662823e385..0de2c50c9d 100644 --- a/apps/confbridge/include/confbridge.h +++ b/apps/confbridge/include/confbridge.h @@ -244,7 +244,10 @@ struct conference_bridge_user { }; /*! \brief load confbridge.conf file */ -int conf_load_config(int reload); +int conf_load_config(void); + +/*! \brief reload confbridge.conf file */ +int conf_reload_config(void); /*! \brief destroy the information loaded from the confbridge.conf file*/ void conf_destroy_config(void);