Module: kamailio Branch: master Commit: 3b213f1d008656682f1733d59f6c3bacd474c4b9 URL: https://github.com/kamailio/kamailio/commit/3b213f1d008656682f1733d59f6c3bac...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2025-02-21T10:49:47+01:00
dialog: get vars via value instead of reference for kemi functions
- do lock/unlock - GH #4151
---
Modified: src/modules/dialog/dialog.c
---
Diff: https://github.com/kamailio/kamailio/commit/3b213f1d008656682f1733d59f6c3bac... Patch: https://github.com/kamailio/kamailio/commit/3b213f1d008656682f1733d59f6c3bac...
---
diff --git a/src/modules/dialog/dialog.c b/src/modules/dialog/dialog.c index 6871cc960e3..382941c9925 100644 --- a/src/modules/dialog/dialog.c +++ b/src/modules/dialog/dialog.c @@ -1852,32 +1852,36 @@ static int fixup_dlg_bridge(void **param, int param_no) return 0; }
-static str *ki_dlg_get_var_helper( - sip_msg_t *msg, str *sc, str *sf, str *st, str *key) +static int ki_dlg_get_var_helper( + sip_msg_t *msg, str *sc, str *sf, str *st, str *key, str *val) { dlg_cell_t *dlg = NULL; unsigned int dir = 0; - str *val = NULL;
if(sc == NULL || sc->s == NULL || sc->len == 0) { LM_ERR("invalid Call-ID parameter\n"); - return val; + return -1; } if(sf == NULL || sf->s == NULL || sf->len == 0) { LM_ERR("invalid From tag parameter\n"); - return val; + return -1; } if(st == NULL) { LM_ERR("invalid To tag parameter\n"); - return val; + return -1; }
dlg = get_dlg(sc, sf, st, &dir); - if(dlg == NULL) - return val; - val = get_dlg_varref(dlg, key); + if(dlg == NULL) { + LM_DBG("dialog not found for call-id: %.*s\n", sc->len, sc->s); + return -1; + } + if(get_dlg_varval(dlg, key, val) != 0) { + dlg_release(dlg); + return -1; + } dlg_release(dlg); - return val; + return 0; }
/** @@ -1888,18 +1892,15 @@ static sr_kemi_xval_t _sr_kemi_dialog_xval = {0}; static sr_kemi_xval_t *ki_dlg_get_var( sip_msg_t *msg, str *sc, str *sf, str *st, str *key) { - str *val = NULL; - memset(&_sr_kemi_dialog_xval, 0, sizeof(sr_kemi_xval_t));
- val = ki_dlg_get_var_helper(msg, sc, sf, st, key); - if(!val) { + if(ki_dlg_get_var_helper(msg, sc, sf, st, key, &_sr_kemi_dialog_xval.v.s) + < 0) { sr_kemi_xval_null(&_sr_kemi_dialog_xval, SR_KEMI_XVAL_NULL_NONE); return &_sr_kemi_dialog_xval; }
_sr_kemi_dialog_xval.vtype = SR_KEMIP_STR; - _sr_kemi_dialog_xval.v.s = *val;
return &_sr_kemi_dialog_xval; } @@ -2504,8 +2505,12 @@ static int ki_dlg_var_sets(sip_msg_t *msg, str *name, str *val) int ret;
dlg = dlg_get_msg_dialog(msg); + if(dlg) { + dlg_cell_lock(dlg); + } ret = set_dlg_variable_unsafe(dlg, name, val); if(dlg) { + dlg_cell_unlock(dlg); dlg_release(dlg); }
@@ -2518,7 +2523,6 @@ static int ki_dlg_var_sets(sip_msg_t *msg, str *name, str *val) static sr_kemi_xval_t *ki_dlg_var_get_mode(sip_msg_t *msg, str *name, int rmode) { dlg_cell_t *dlg; - str *pval;
memset(&_sr_kemi_dialog_xval, 0, sizeof(sr_kemi_xval_t));
@@ -2527,14 +2531,12 @@ static sr_kemi_xval_t *ki_dlg_var_get_mode(sip_msg_t *msg, str *name, int rmode) sr_kemi_xval_null(&_sr_kemi_dialog_xval, rmode); return &_sr_kemi_dialog_xval; } - pval = get_dlg_varref(dlg, name); - if(pval == NULL || pval->s == NULL) { + if(get_dlg_varval(dlg, name, &_sr_kemi_dialog_xval.v.s) < 0) { sr_kemi_xval_null(&_sr_kemi_dialog_xval, rmode); goto done; }
_sr_kemi_dialog_xval.vtype = SR_KEMIP_STR; - _sr_kemi_dialog_xval.v.s = *pval;
done: dlg_release(dlg); @@ -2572,7 +2574,12 @@ static int ki_dlg_var_rm(sip_msg_t *msg, str *name) dlg_cell_t *dlg;
dlg = dlg_get_msg_dialog(msg); - set_dlg_variable_unsafe(dlg, name, NULL); + if(dlg) { + dlg_cell_lock(dlg); + set_dlg_variable_unsafe(dlg, name, NULL); + dlg_cell_unlock(dlg); + dlg_release(dlg); + } return 1; }