diff --git a/mbuni/mmlib/mms_cfg-impl.h b/mbuni/mmlib/mms_cfg-impl.h index f76e141..86831fb 100644 --- a/mbuni/mmlib/mms_cfg-impl.h +++ b/mbuni/mmlib/mms_cfg-impl.h @@ -25,6 +25,7 @@ typedef struct mCfgImpFuncs { mCfgGrp *(*get_multi_by_field)(mCfgImpl *cfg, Octstr *name, Octstr *field, Octstr *value); Octstr *(*get)(mCfgImpl *cfg, mCfgGrp *grp, Octstr *name); Octstr *(*get_grp_name)(mCfgImpl *, mCfgGrp *); + void (*destroy_grp)(mCfgImpl *cfg, mCfgGrp *); } mCfgImpFuncs; diff --git a/mbuni/mmlib/mms_cfg.c b/mbuni/mmlib/mms_cfg.c index f9ad45f..fa77422 100644 --- a/mbuni/mmlib/mms_cfg.c +++ b/mbuni/mmlib/mms_cfg.c @@ -303,6 +303,14 @@ List *mms_cfg_get_multi(mCfg *cfg, Octstr *name) return cfg->cfg_funcs->get_multi(cfg->xcfg, name); } +void mms_cfg_destroy_grp(mCfg *cfg, mCfgGrp *grp) +{ + gw_assert(cfg); + if (cfg->xcfg == NULL || cfg->cfg_funcs == NULL || cfg->cfg_funcs->destroy_grp == NULL) + return; + else + cfg->cfg_funcs->destroy_grp(cfg->xcfg, grp); +} mCfgGrp *mms_get_multi_by_field(mCfg *cfg, Octstr *name, Octstr *field, Octstr *value) { diff --git a/mbuni/mmlib/mms_cfg.h b/mbuni/mmlib/mms_cfg.h index c480d87..906bcc0 100644 --- a/mbuni/mmlib/mms_cfg.h +++ b/mbuni/mmlib/mms_cfg.h @@ -36,6 +36,11 @@ List *mms_cfg_get_multi(mCfg *cfg,Octstr *name); mCfgGrp *mms_get_multi_by_field(mCfg *cfg, Octstr *name, Octstr *field, Octstr *value); +/* Destroy a group object after user -- call this to cleanup memory used by group object + * always! + */ +void mms_cfg_destroy_grp(mCfg *, mCfgGrp *); + /* Get a string field value from a group. */ Octstr *mms_cfg_get(mCfg *cfg, mCfgGrp *grp, Octstr *name); diff --git a/mbuni/mmsbox/mmsbox_cfg.c b/mbuni/mmsbox/mmsbox_cfg.c index 059428c..63eda21 100644 --- a/mbuni/mmsbox/mmsbox_cfg.c +++ b/mbuni/mmsbox/mmsbox_cfg.c @@ -241,6 +241,8 @@ int mms_load_mmsbox_settings(Octstr *fname, gwthread_func_t *mmsc_handler_func) u->rr_url = _mms_cfg_getx(cfg, x, octstr_imm("read-report-url")); u->mmsc = mms_cfg_get(cfg, x, octstr_imm("mmsc")); gwlist_append(sendmms_users, u); + + mms_cfg_destroy_grp(cfg, x); } gwlist_destroy(l, NULL); @@ -252,8 +254,9 @@ int mms_load_mmsbox_settings(Octstr *fname, gwthread_func_t *mmsc_handler_func) List *errors = gwlist_create(); List *warnings = gwlist_create(); Octstr *x; + mCfgGrp *xgrp = gwlist_get(l, i); - start_mmsc_from_conf(cfg, gwlist_get(l, i), mmsc_handler_func, errors, warnings); + start_mmsc_from_conf(cfg, xgrp, mmsc_handler_func, errors, warnings); while ((x = gwlist_extract_first(errors)) != NULL) { mms_error(0, "mmsbox", NULL, "%s", octstr_get_cstr(x)); @@ -266,6 +269,8 @@ int mms_load_mmsbox_settings(Octstr *fname, gwthread_func_t *mmsc_handler_func) } gwlist_destroy(errors, NULL); gwlist_destroy(warnings, NULL); + + mms_cfg_destroy_grp(cfg, xgrp); } gwlist_destroy(l, NULL); @@ -409,6 +414,8 @@ int mms_load_mmsbox_settings(Octstr *fname, gwthread_func_t *mmsc_handler_func) m->service_code = mms_cfg_get(cfg, x, octstr_imm("service-code")); m->special_header = mms_cfg_get(cfg, x, octstr_imm("extra-reply-content-header")); gwlist_append(mms_services, m); + + mms_cfg_destroy_grp(cfg, x); } /* Finally load admin-port config and start the thingie */ @@ -437,6 +444,8 @@ int mms_load_mmsbox_settings(Octstr *fname, gwthread_func_t *mmsc_handler_func) gwlist_destroy(l, NULL); octstr_destroy(gdir); + mms_cfg_destroy_grp(cfg, cgrp); + mms_cfg_destroy_grp(cfg, grp); return 0; } @@ -1017,7 +1026,8 @@ static void admin_handler(void *unused) } gwlist_destroy(e, (void *)octstr_destroy); gwlist_destroy(w, (void *)octstr_destroy); - + + mms_cfg_destroy_grp(cfg, m); } } else if (octstr_str_case_compare(url, "/stop") == 0) { Octstr *x; diff --git a/mbuni/mmsc/mmsc_cfg.c b/mbuni/mmsc/mmsc_cfg.c index af442af..a0c1852 100644 --- a/mbuni/mmsc/mmsc_cfg.c +++ b/mbuni/mmsc/mmsc_cfg.c @@ -319,8 +319,8 @@ MmscSettings *mms_load_mmsc_settings(Octstr *fname, List **proxyrelays) List *e = gwlist_create(); List *w = gwlist_create(); Octstr *x; - - mmsc_load_vasp_from_conf(m, gwlist_get(l, i), e, w); + mCfgGrp *xgrp = gwlist_get(l, i); + mmsc_load_vasp_from_conf(m, xgrp, e, w); while ((x = gwlist_extract_first(e)) != NULL) { mms_error(0, "mmsc", NULL, "%s", octstr_get_cstr(x)); @@ -333,6 +333,8 @@ MmscSettings *mms_load_mmsc_settings(Octstr *fname, List **proxyrelays) } gwlist_destroy(e, NULL); gwlist_destroy(w, NULL); + + mms_cfg_destroy_grp(cfg, xgrp); } gwlist_destroy(l, NULL); @@ -361,6 +363,10 @@ MmscSettings *mms_load_mmsc_settings(Octstr *fname, List **proxyrelays) } else if (m->admin_pass == NULL) mms_warning(0, "mmsc", NULL, "Empty or no password supplied for admin port. All requests will be allowed!"); + + mms_cfg_destroy_grp(cfg, cgrp); + mms_cfg_destroy_grp(cfg, grp); + return m; } @@ -546,6 +552,8 @@ List *mms_proxy_relays(mCfg *cfg, Octstr *myhostname) mms_warning(0, "mmsc", NULL,"MMSC Config: Found MM4 Proxy %s with same hostname as local host!", octstr_get_cstr(m->name)); gwlist_append(l, m); + + mms_cfg_destroy_grp(cfg, grp); } gwlist_destroy(gl, NULL); @@ -975,7 +983,8 @@ static void admin_handler(MmscSettings *settings) } gwlist_destroy(e, (void *)octstr_destroy); gwlist_destroy(w, (void *)octstr_destroy); - + + mms_cfg_destroy_grp(settings->cfg, m); } } else if (octstr_str_case_compare(url, "/stop") == 0) { Octstr *x;