diff options
author | George Joseph <gjoseph@digium.com> | 2017-05-04 15:04:46 -0600 |
---|---|---|
committer | George Joseph <gjoseph@digium.com> | 2017-05-04 20:13:55 -0500 |
commit | 000183415717adae0c5ce1dd015213e7ee286dd4 (patch) | |
tree | 5cdec96dff5603fadfdf5275e81f26d276fb6322 /apps/confbridge/conf_config_parser.c | |
parent | a20db27c561c5f481a4e84b174366fb98502b166 (diff) |
app_confbridge: Fix reference to cfg in menu_template_handler
menu_template_handler wasn't properly accounting for the fact that
it might be called both during a load/reload (which isn't really
valid but not prevented) and by a dialplan function. In both cases
it was attempting to use the "pending" config which wasn't valid in
the latter case. aco_process_config is also partly to blame because
it wasn't properly cleaning "pending" up when a reload was done and
no changes were made. Both of these contributed to a crash if
CONFBRIDGE(menu,template) was called in a dialplan after a reload.
* aco_process_config now sets info->internal->pending to NULL
after it unrefs it although this isn't strictly necessary in the
context of this fix.
* menu_template_handler now uses the "current" config and silently
ignores any attempt to be called as a result of someone uses the
"template" parameter in the conf file.
Luckily there's no other place in the codebase where
aco_pending_config is used outside of aco_process_config.
ASTERISK-25506 #close
Reported-by: Frederic LE FOLL
Change-Id: Ib349a17d3d088f092480b19addd7122fcaac21a7
Diffstat (limited to 'apps/confbridge/conf_config_parser.c')
-rw-r--r-- | apps/confbridge/conf_config_parser.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index 4729139c2..3e4075ba9 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -2077,7 +2077,7 @@ static int conf_menu_profile_copy(struct conf_menu *dst, struct conf_menu *src) static int menu_template_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) { struct conf_menu *dst_menu = obj; - struct confbridge_cfg *cfg = aco_pending_config(&cfg_info); + RAII_VAR(struct confbridge_cfg *, cfg, ao2_global_obj_ref(cfg_handle), ao2_cleanup); RAII_VAR(struct conf_menu *, src_menu, NULL, ao2_cleanup); if (!cfg) { @@ -2112,6 +2112,7 @@ static int verify_default_profiles(void) RAII_VAR(struct user_profile *, user_profile, NULL, ao2_cleanup); RAII_VAR(struct bridge_profile *, bridge_profile, NULL, ao2_cleanup); RAII_VAR(struct conf_menu *, menu_profile, NULL, ao2_cleanup); + /* We can only be called as a result of an aco_process_config so this is safe */ struct confbridge_cfg *cfg = aco_pending_config(&cfg_info); if (!cfg) { @@ -2213,6 +2214,7 @@ int conf_load_config(void) /* Menu options */ aco_option_register(&cfg_info, "type", ACO_EXACT, menu_types, NULL, OPT_NOOP_T, 0, 0); + /* This option should only be used with the CONFBRIDGE dialplan function */ aco_option_register_custom(&cfg_info, "template", ACO_EXACT, menu_types, NULL, menu_template_handler, 0); aco_option_register_custom(&cfg_info, "^[0-9A-D*#]+$", ACO_REGEX, menu_types, NULL, menu_option_handler, 0); |