mirror of https://github.com/sipwise/kamailio.git
Change-Id: Icefae92196ceee1d2de297ae2dd3d5e810d5a2dd
(cherry picked from commit 3daf8ae028)
mr10.5.4
parent
eae2f8eed0
commit
5359e50c09
@ -0,0 +1,97 @@
|
||||
From: Victor Seva <vseva@sipwise.com>
|
||||
Date: Thu, 9 Feb 2023 11:45:29 +0100
|
||||
Subject: usrloc: correct AOR value on usrloc:contact-expired
|
||||
|
||||
previously $ulc(x=>aor) had only the user part even with use_domain set
|
||||
---
|
||||
src/modules/usrloc/udomain.c | 39 +++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 31 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/src/modules/usrloc/udomain.c b/src/modules/usrloc/udomain.c
|
||||
index 4025cc5..d7b9e8a 100644
|
||||
--- a/src/modules/usrloc/udomain.c
|
||||
+++ b/src/modules/usrloc/udomain.c
|
||||
@@ -956,7 +956,7 @@ int udomain_contact_expired_cb(db1_con_t* _c, udomain_t* _d)
|
||||
db_val_t query_vals[3];
|
||||
int key_num = 2;
|
||||
db1_res_t* res = NULL;
|
||||
- str user, contact;
|
||||
+ str user, contact, domain;
|
||||
int i;
|
||||
int n;
|
||||
urecord_t r;
|
||||
@@ -964,6 +964,9 @@ int udomain_contact_expired_cb(db1_con_t* _c, udomain_t* _d)
|
||||
#define RUIDBUF_SIZE 128
|
||||
char ruidbuf[RUIDBUF_SIZE];
|
||||
str ruid;
|
||||
+#define AORBUF_SIZE 512
|
||||
+ char aorbuf[AORBUF_SIZE];
|
||||
+ str aor;
|
||||
|
||||
if (ul_db_mode!=DB_ONLY) {
|
||||
return 0;
|
||||
@@ -1058,6 +1061,14 @@ int udomain_contact_expired_cb(db1_con_t* _c, udomain_t* _d)
|
||||
continue;
|
||||
}
|
||||
user.len = strlen(user.s);
|
||||
+ if(user.len < AORBUF_SIZE ) {
|
||||
+ memcpy(aorbuf, user.s, user.len);
|
||||
+ aor.s = aorbuf;
|
||||
+ aor.len = user.len;
|
||||
+ } else {
|
||||
+ LM_ERR("user is too long %d\n", user.len);
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
ci = dbrow2info(ROW_VALUES(row)+1, &contact, 0);
|
||||
if (ci==0) {
|
||||
@@ -1066,18 +1077,30 @@ int udomain_contact_expired_cb(db1_con_t* _c, udomain_t* _d)
|
||||
continue;
|
||||
}
|
||||
|
||||
- lock_udomain(_d, &user);
|
||||
+ if(ul_use_domain) {
|
||||
+ domain.s = (char*)VAL_STRING(ROW_VALUES(row)+20);
|
||||
+ domain.len = strlen(domain.s);
|
||||
+ if(domain.len + aor.len < AORBUF_SIZE) {
|
||||
+ aorbuf[aor.len] = '@';
|
||||
+ memcpy(aorbuf+aor.len+1, domain.s, domain.len);
|
||||
+ aor.len += domain.len + 1;
|
||||
+ } else {
|
||||
+ LM_ERR("aor too long, using user part only\n");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ lock_udomain(_d, &aor);
|
||||
/* don't use the same static value from get_static_urecord() */
|
||||
memset( &r, 0, sizeof(struct urecord) );
|
||||
- r.aor = user;
|
||||
- r.aorhash = ul_get_aorhash(&user);
|
||||
+ r.aor = aor;
|
||||
+ r.aorhash = ul_get_aorhash(&aor);
|
||||
r.domain = _d->name;
|
||||
|
||||
if ( (c=mem_insert_ucontact(&r, &contact, ci)) == 0) {
|
||||
LM_ERR("inserting temporary contact failed for %.*s\n",
|
||||
- user.len, user.s);
|
||||
+ aor.len, aor.s);
|
||||
release_urecord(&r);
|
||||
- unlock_udomain(_d, &user);
|
||||
+ unlock_udomain(_d, &aor);
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -1096,11 +1119,11 @@ int udomain_contact_expired_cb(db1_con_t* _c, udomain_t* _d)
|
||||
ruid.len = c->ruid.len;
|
||||
} else {
|
||||
LM_ERR("ruid is too long %d for %.*s\n", c->ruid.len,
|
||||
- user.len, user.s);
|
||||
+ aor.len, aor.s);
|
||||
}
|
||||
}
|
||||
release_urecord(&r);
|
||||
- unlock_udomain(_d, &user);
|
||||
+ unlock_udomain(_d, &aor);
|
||||
if(ruid.len > 0 && ul_xavp_contact_name.s != NULL) {
|
||||
/* delete attributes by ruid */
|
||||
uldb_delete_attrs_ruid(_d->name, &ruid);
|
||||
Loading…
Reference in new issue