|
|
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 |
}
|