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
This commit is contained in:
Richard Mudgett
2013-06-13 18:47:48 +00:00
parent 7e0ebaa2e0
commit 365e81053b
3 changed files with 21 additions and 14 deletions

View File

@@ -3098,7 +3098,7 @@ static int load_module(void)
{ {
int res = 0; int res = 0;
if (conf_load_config(0)) { if (conf_load_config()) {
ast_log(LOG_ERROR, "Unable to load config. Not loading module.\n"); ast_log(LOG_ERROR, "Unable to load config. Not loading module.\n");
return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_DECLINE;
} }
@@ -3145,7 +3145,7 @@ static int load_module(void)
static int reload(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", AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Conference Bridge Application",

View File

@@ -1320,13 +1320,11 @@ static int verify_default_profiles(void)
return 0; return 0;
} }
int conf_load_config(int reload) int conf_load_config(void)
{ {
if (!reload) {
if (aco_info_init(&cfg_info)) { if (aco_info_init(&cfg_info)) {
return -1; return -1;
} }
}
/* User options */ /* User options */
aco_option_register(&cfg_info, "type", ACO_EXACT, user_types, NULL, OPT_NOOP_T, 0, 0); aco_option_register(&cfg_info, "type", ACO_EXACT, user_types, NULL, OPT_NOOP_T, 0, 0);
@@ -1373,23 +1371,29 @@ int conf_load_config(int reload)
/* Menu options */ /* Menu options */
aco_option_register_custom(&cfg_info, "^[0-9A-D*#]+$", ACO_REGEX, menu_types, NULL, menu_option_handler, 0); 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; 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; goto error;
} }
return 0; return 0;
error: error:
/* On a reload, just keep the config we already have in place. */
if (!reload) {
conf_destroy_config(); conf_destroy_config();
}
return -1; 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) static void conf_user_profile_copy(struct user_profile *dst, struct user_profile *src)
{ {
*dst = *src; *dst = *src;

View File

@@ -244,7 +244,10 @@ struct conference_bridge_user {
}; };
/*! \brief load confbridge.conf file */ /*! \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*/ /*! \brief destroy the information loaded from the confbridge.conf file*/
void conf_destroy_config(void); void conf_destroy_config(void);