Module: kamailio Branch: 4.4 Commit: 9e343f3585a148f9a117195f179723e74bc475e8 URL: https://github.com/kamailio/kamailio/commit/9e343f3585a148f9a117195f179723e7...
Author: lazedo luis.azedo@factorlusitano.com Committer: Luis Azedo luis@2600hz.com Date: 2017-05-19T12:45:17+01:00
registrar: proper linking of xavps in the xavp_rcd
- avoid leaking of shm when using save() in async operations - part of PR #1111
(cherry picked from commit bb3840161acd3b2dbe41001ebfb2bd779bfd68d0)
Conflicts: modules/registrar/lookup.c modules/registrar/reply.c
---
Modified: modules/registrar/lookup.c Modified: modules/registrar/reply.c
---
Diff: https://github.com/kamailio/kamailio/commit/9e343f3585a148f9a117195f179723e7... Patch: https://github.com/kamailio/kamailio/commit/9e343f3585a148f9a117195f179723e7...
---
diff --git a/modules/registrar/lookup.c b/modules/registrar/lookup.c index 50da15d622..62c0bf86a6 100644 --- a/modules/registrar/lookup.c +++ b/modules/registrar/lookup.c @@ -96,8 +96,9 @@ int lookup_to_dset(struct sip_msg* _m, udomain_t* _d, str* _uri) { * add xavp with details of the record (ruid, ...) */ int xavp_rcd_helper(ucontact_t* ptr) { - sr_xavp_t *xavp=NULL; + sr_xavp_t **xavp=NULL; sr_xavp_t *list=NULL; + sr_xavp_t *new_xavp=NULL; str xname_ruid = {"ruid", 4}; str xname_received = { "received", 8}; str xname_contact = { "contact", 7}; @@ -105,34 +106,34 @@ int xavp_rcd_helper(ucontact_t* ptr) {
if(ptr==NULL) return -1;
- if(reg_xavp_rcd.s!=NULL) - { - list = xavp_get(®_xavp_rcd, NULL); - xavp = list; - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_STR; - xval.v.s = ptr->ruid; - xavp_add_value(&xname_ruid, &xval, &xavp); - - if(ptr->received.len > 0) - { - memset(&xval, 0, sizeof(sr_xval_t)); - xval.type = SR_XTYPE_STR; - xval.v.s = ptr->received; - xavp_add_value(&xname_received, &xval, &xavp); - } + if(reg_xavp_rcd.s==NULL || reg_xavp_rcd.len<=0) return 0; + + list = xavp_get(®_xavp_rcd, NULL); + xavp = list ? &list->val.v.xavp : &new_xavp; + memset(&xval, 0, sizeof(sr_xval_t)); + xval.type = SR_XTYPE_STR; + xval.v.s = ptr->ruid; + xavp_add_value(&xname_ruid, &xval, xavp);
+ if(ptr->received.len > 0) { memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_STR; - xval.v.s = ptr->c; - xavp_add_value(&xname_contact, &xval, &xavp); - - if(list==NULL) - { - /* no reg_xavp_rcd xavp in root list - add it */ - xval.type = SR_XTYPE_XAVP; - xval.v.xavp = xavp; - xavp_add_value(®_xavp_rcd, &xval, NULL); + xval.v.s = ptr->received; + xavp_add_value(&xname_received, &xval, xavp); + } + + memset(&xval, 0, sizeof(sr_xval_t)); + xval.type = SR_XTYPE_STR; + xval.v.s = ptr->c; + xavp_add_value(&xname_contact, &xval, xavp); + + if(list==NULL) { + /* no reg_xavp_rcd xavp in root list - add it */ + xval.type = SR_XTYPE_XAVP; + xval.v.xavp = *xavp; + if(xavp_add_value(®_xavp_rcd, &xval, NULL)==NULL) { + LM_ERR("cannot add ruid xavp to root list\n"); + xavp_destroy_list(xavp); } } return 0; diff --git a/modules/registrar/reply.c b/modules/registrar/reply.c index 27cc6f3bca..884012b443 100644 --- a/modules/registrar/reply.c +++ b/modules/registrar/reply.c @@ -173,8 +173,9 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) unsigned int ahash; unsigned short digit; int mode; - sr_xavp_t *xavp=NULL; + sr_xavp_t **xavp=NULL; sr_xavp_t *list=NULL; + sr_xavp_t *new_xavp=NULL; str xname = {"ruid", 4}; sr_xval_t xval;
@@ -212,7 +213,7 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) if(reg_xavp_rcd.s!=NULL) { list = xavp_get(®_xavp_rcd, NULL); - xavp = list; + xavp = list ? &list->val.v.xavp : &new_xavp; }
fl = 0; @@ -334,7 +335,7 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_STR; xval.v.s = c->ruid; - if(xavp_add_value(&xname, &xval, &xavp)==NULL) { + if(xavp_add_value(&xname, &xval, xavp)==NULL) { LM_ERR("cannot add ruid value to xavp\n"); } } @@ -346,14 +347,13 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host) /* add xavp with details of the record (ruid, ...) */ if(reg_xavp_rcd.s!=NULL) { - if(list==NULL && xavp!=NULL) + if(list==NULL && *xavp!=NULL) { - /* no reg_xavp_rcd xavp in root list - add it */ xval.type = SR_XTYPE_XAVP; - xval.v.xavp = xavp; + xval.v.xavp = *xavp; if(xavp_add_value(®_xavp_rcd, &xval, NULL)==NULL) { LM_ERR("cannot add ruid xavp to root list\n"); - xavp_destroy_list(&xavp); + xavp_destroy_list(xavp); } } }