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
This commit is contained in:
George Joseph
2017-05-04 15:04:46 -06:00
parent 1d44c838d8
commit bed6c0d04b
2 changed files with 8 additions and 1 deletions

View File

@@ -588,10 +588,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;
}
@@ -704,6 +707,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)