aa419c5
From: Bogdan-Andrei Iancu <bogdan@opensips.org>
aa419c5
Date: Wed, 17 Feb 2016 18:28:51 +0200
aa419c5
Subject: [PATCH] Fix contact DB delete in CONTACT_ONLY macthing.
aa419c5
aa419c5
Do not use the callid as part of the key during the DB delete as it may changed (can be updated) in the meanwhile.
aa419c5
Reported by @ferrored.
aa419c5
Closing #764
aa419c5
Many thanks to @ferrored for his support in troubleshooting this issue.
aa419c5
aa419c5
diff --git a/modules/usrloc/ucontact.c b/modules/usrloc/ucontact.c
aa419c5
index 3986f67..af6da89 100644
aa419c5
--- a/modules/usrloc/ucontact.c
aa419c5
+++ b/modules/usrloc/ucontact.c
aa419c5
@@ -805,6 +805,7 @@ int db_delete_ucontact(ucontact_t* _c)
aa419c5
 	char* dom;
aa419c5
 	db_key_t keys[4];
aa419c5
 	db_val_t vals[4];
aa419c5
+	int n;
aa419c5
 
aa419c5
 	if (_c->flags & FL_MEM) {
aa419c5
 		return 0;
aa419c5
@@ -812,8 +813,6 @@ int db_delete_ucontact(ucontact_t* _c)
aa419c5
 
aa419c5
 	keys[0] = &user_col;
aa419c5
 	keys[1] = &contact_col;
aa419c5
-	keys[2] = &callid_col;
aa419c5
-	keys[3] = &domain_col;
aa419c5
 
aa419c5
 	vals[0].type = DB_STR;
aa419c5
 	vals[0].nul = 0;
aa419c5
@@ -823,22 +822,30 @@ int db_delete_ucontact(ucontact_t* _c)
aa419c5
 	vals[1].nul = 0;
aa419c5
 	vals[1].val.str_val = _c->c;
aa419c5
 
aa419c5
-	vals[2].type = DB_STR;
aa419c5
-	vals[2].nul = 0;
aa419c5
-	vals[2].val.str_val = _c->callid;
aa419c5
+	n = 2;
aa419c5
+
aa419c5
+	if (matching_mode==CONTACT_CALLID) {
aa419c5
+		vals[n].type = DB_STR;
aa419c5
+		vals[n].nul = 0;
aa419c5
+		vals[n].val.str_val = _c->callid;
aa419c5
+
aa419c5
+		keys[n++] = &callid_col;
aa419c5
+	}
aa419c5
 
aa419c5
 	if (use_domain) {
aa419c5
-		vals[3].type = DB_STR;
aa419c5
-		vals[3].nul = 0;
aa419c5
+		vals[n].type = DB_STR;
aa419c5
+		vals[n].nul = 0;
aa419c5
 		dom = q_memchr(_c->aor->s, '@', _c->aor->len);
aa419c5
 		if (dom==0) {
aa419c5
 			vals[0].val.str_val.len = 0;
aa419c5
-			vals[3].val.str_val = *_c->aor;
aa419c5
+			vals[n].val.str_val = *_c->aor;
aa419c5
 		} else {
aa419c5
 			vals[0].val.str_val.len = dom - _c->aor->s;
aa419c5
-			vals[3].val.str_val.s = dom + 1;
aa419c5
-			vals[3].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
aa419c5
+			vals[n].val.str_val.s = dom + 1;
aa419c5
+			vals[n].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
aa419c5
 		}
aa419c5
+
aa419c5
+		keys[n++] = &domain_col;
aa419c5
 	}
aa419c5
 
aa419c5
 	if (ul_dbf.use_table(ul_dbh, _c->domain) < 0) {
aa419c5
@@ -848,7 +855,7 @@ int db_delete_ucontact(ucontact_t* _c)
aa419c5
 
aa419c5
 	CON_PS_REFERENCE(ul_dbh) = &my_ps;
aa419c5
 
aa419c5
-	if (ul_dbf.delete(ul_dbh, keys, 0, vals, (use_domain) ? (4) : (3)) < 0) {
aa419c5
+	if (ul_dbf.delete(ul_dbh, keys, 0, vals, n) < 0) {
aa419c5
 		LM_ERR("deleting from database failed\n");
aa419c5
 		return -1;
aa419c5
 	}