Bladeren bron

dialog: get vars via value instead of reference for kemi functions

- do lock/unlock
- GH #4151
Daniel-Constantin Mierla 6 maanden geleden
bovenliggende
commit
3b213f1d00
1 gewijzigde bestanden met toevoegingen van 27 en 20 verwijderingen
  1. 27 20
      src/modules/dialog/dialog.c

+ 27 - 20
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;
 }