Ensure global types in the config framework are initialized

If a config object was allocated but one of its global objects was
never encountered, then the global object's defaults were never
applied. Ensure that global objects are initialized properly upon
allocation instead of on configuration.

Review: https://reviewboard.asterisk.org/r/2866/
........

Merged revisions 399564 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@399565 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kinsey Moore
2013-09-20 22:41:25 +00:00
parent cebe08bf53
commit c71782321c

View File

@@ -478,10 +478,6 @@ static int process_category(struct ast_config *cfg, struct aco_info *info, struc
}
if (type->type == ACO_GLOBAL && *field) {
if (aco_set_defaults(type, cat, *field)) {
ast_log(LOG_ERROR, "In %s: Setting defaults for %s failed\n", file->filename, cat);
return -1;
}
if (aco_process_category_options(type, cfg, cat, *field)) {
ast_log(LOG_ERROR, "In %s: Processing options for %s failed\n", file->filename, cat);
return -1;
@@ -618,6 +614,28 @@ enum aco_process_status aco_process_config(struct aco_info *info, int reload)
*/
while (res != ACO_PROCESS_ERROR && (file = info->files[x++])) {
const char *filename = file->filename;
struct aco_type *match;
int i;
/* set defaults for global objects */
for (i = 0, match = file->types[i]; match; match = file->types[++i]) {
void **field = info->internal->pending + match->item_offset;
if (match->type != ACO_GLOBAL || !*field) {
continue;
}
if (aco_set_defaults(match, match->category, *field)) {
ast_log(LOG_ERROR, "In %s: Setting defaults for %s failed\n", file->filename, match->category);
res = ACO_PROCESS_ERROR;
break;
}
}
if (res == ACO_PROCESS_ERROR) {
break;
}
try_alias:
if (!(cfg = ast_config_load(filename, cfg_flags))) {
if (file->alias && strcmp(file->alias, filename)) {