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 /main | |
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 'main')
-rw-r--r-- | main/config_options.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/main/config_options.c b/main/config_options.c index 18b04ff7d..c80777906 100644 --- a/main/config_options.c +++ b/main/config_options.c @@ -586,10 +586,13 @@ enum aco_process_status aco_process_ast_config(struct aco_info *info, struct aco }; ao2_cleanup(info->internal->pending); + info->internal->pending = NULL; return ACO_PROCESS_OK; error: ao2_cleanup(info->internal->pending); + info->internal->pending = NULL; + return ACO_PROCESS_ERROR; } @@ -702,6 +705,8 @@ try_alias: end: ao2_cleanup(info->internal->pending); + info->internal->pending = NULL; + return res; } int aco_process_var(struct aco_type *type, const char *cat, struct ast_variable *var, void *obj) |