Module: sip-router Branch: master Commit: 2ebc2cac489596f6b19bc1cebf25b57b1b69331c URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2ebc2cac...
Author: Miklos Tirpak miklos@iptel.org Committer: Miklos Tirpak miklos@iptel.org Date: Fri Jun 3 14:37:03 2011 +0200
cfg framework: safety checks added
Verify that the child process has a local configuration in the functions that work with config group instances.
---
cfg/cfg_struct.c | 60 ++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/cfg/cfg_struct.c b/cfg/cfg_struct.c index 6e93ca0..c10dd55 100644 --- a/cfg/cfg_struct.c +++ b/cfg/cfg_struct.c @@ -1100,26 +1100,28 @@ void cfg_move_handle(cfg_group_t *group, cfg_group_inst_t *src_ginst, cfg_group_ dst_ginst->vars : CFG_GROUP_DATA(cfg_local, group);
- /* call the per child process callback of those variables - that have different value in the two group instances */ - /* TODO: performance optimization: this entire loop can be - skipped if the group does not have any variable with - per-child process callback. Use some flag in the group - structure for this purpose. */ - gname.s = group->name; - gname.len = group->name_len; - for (i = 0; i < CFG_MAX_VAR_NUM/(sizeof(int)*8); i++) { - bitmap = ((src_ginst) ? src_ginst->set[i] : 0U) - | ((dst_ginst) ? dst_ginst->set[i] : 0U); - while (bitmap) { - pos = bit_scan_forward32(bitmap); - var = &group->mapping[pos + i*sizeof(int)*8]; - if (var->def->on_set_child_cb) { - vname.s = var->def->name; - vname.len = var->name_len; - var->def->on_set_child_cb(&gname, &vname); + if (cfg_child_cb != CFG_NO_CHILD_CBS) { + /* call the per child process callback of those variables + that have different value in the two group instances */ + /* TODO: performance optimization: this entire loop can be + skipped if the group does not have any variable with + per-child process callback. Use some flag in the group + structure for this purpose. */ + gname.s = group->name; + gname.len = group->name_len; + for (i = 0; i < CFG_MAX_VAR_NUM/(sizeof(int)*8); i++) { + bitmap = ((src_ginst) ? src_ginst->set[i] : 0U) + | ((dst_ginst) ? dst_ginst->set[i] : 0U); + while (bitmap) { + pos = bit_scan_forward32(bitmap); + var = &group->mapping[pos + i*sizeof(int)*8]; + if (var->def->on_set_child_cb) { + vname.s = var->def->name; + vname.len = var->name_len; + var->def->on_set_child_cb(&gname, &vname); + } + bitmap -= (1U << pos); } - bitmap -= (1U << pos); } } /* keep track of how many group instences are set in the child process */ @@ -1140,6 +1142,11 @@ int cfg_select(cfg_group_t *group, unsigned int id) { cfg_group_inst_t *ginst;
+ if (!cfg_local) { + LOG(L_ERR, "ERROR: The child process has no local configuration\n"); + return -1; + } + if (!(ginst = cfg_find_group(CFG_GROUP_META(cfg_local, group), group->size, id)) @@ -1161,6 +1168,11 @@ int cfg_select(cfg_group_t *group, unsigned int id) /* Reset the group handle to the default, local configuration */ int cfg_reset(cfg_group_t *group) { + if (!cfg_local) { + LOG(L_ERR, "ERROR: The child process has no local configuration\n"); + return -1; + } + cfg_move_handle(group, CFG_HANDLE_TO_GINST(*(group->handle)), /* the active group instance */ NULL); @@ -1183,6 +1195,11 @@ int cfg_select_first(cfg_group_t *group) cfg_group_meta_t *meta; cfg_group_inst_t *ginst;
+ if (!cfg_local) { + LOG(L_ERR, "ERROR: The child process has no local configuration\n"); + return -1; + } + meta = CFG_GROUP_META(cfg_local, group); if (!meta || (meta->num == 0)) return -1; @@ -1212,6 +1229,11 @@ int cfg_select_next(cfg_group_t *group) cfg_group_inst_t *old_ginst, *new_ginst; int size;
+ if (!cfg_local) { + LOG(L_ERR, "ERROR: The child process has no local configuration\n"); + return -1; + } + if (!(meta = CFG_GROUP_META(cfg_local, group))) return -1;