diff --git a/debian/patches/upstream/0008-registrar-handle-error-case-when-deleting-contact-fa.patch b/debian/patches/upstream/0008-registrar-handle-error-case-when-deleting-contact-fa.patch new file mode 100644 index 000000000..990351bca --- /dev/null +++ b/debian/patches/upstream/0008-registrar-handle-error-case-when-deleting-contact-fa.patch @@ -0,0 +1,282 @@ +From efb2670ef03b69cb0ae26e7c9ac427c995ffbacf Mon Sep 17 00:00:00 2001 +From: Daniel-Constantin Mierla +Date: Mon, 9 Dec 2013 10:05:11 +0100 +Subject: [PATCH] registrar: handle error case when deleting contact fails for + unregister() + +- reformatted file + +(cherry picked from commit 67d218e29457ffd75148c8c520b26ec6f3f41719) +--- + modules/registrar/save.c | 103 ++++++++++++++++++++++++----------------------- + 1 file changed, 52 insertions(+), 51 deletions(-) + +diff --git a/modules/registrar/save.c b/modules/registrar/save.c +index fc5d564..caa81df 100644 +--- a/modules/registrar/save.c ++++ b/modules/registrar/save.c +@@ -95,7 +95,7 @@ static inline int star(sip_msg_t *_m, udomain_t* _d, str* _a, str *_h) + { + urecord_t* r; + ucontact_t* c; +- ++ + ul.lock_udomain(_d, _a); + + if (!ul.get_urecord(_d, _a, &r)) { +@@ -114,11 +114,11 @@ static inline int star(sip_msg_t *_m, udomain_t* _d, str* _a, str *_h) + + if (ul.delete_urecord(_d, _a, r) < 0) { + LM_ERR("failed to remove record from usrloc\n"); +- +- /* Delete failed, try to get corresponding +- * record structure and send back all existing +- * contacts +- */ ++ ++ /* Delete failed, try to get corresponding ++ * record structure and send back all existing ++ * contacts ++ */ + rerrno = R_UL_DEL_R; + if (!ul.get_urecord(_d, _a, &r)) { + build_contact(_m, r->contacts, _h); +@@ -133,7 +133,7 @@ static inline int star(sip_msg_t *_m, udomain_t* _d, str* _a, str *_h) + + + /*! \brief +- */ ++*/ + static struct socket_info *get_sock_val(struct sip_msg *msg) + { + struct socket_info *sock; +@@ -179,10 +179,10 @@ static struct socket_info *get_sock_val(struct sip_msg *msg) + socks = vavp->val.v.s; + } + if (parse_phostport( socks.s, &hosts.s, &hosts.len, +- &port, &proto)!=0) { ++ &port, &proto)!=0) { + socks.s[socks.len] = c; + LM_ERR("bad socket <%.*s> in \n", +- socks.len, socks.s); ++ socks.len, socks.s); + return 0; + } + if(sock_hdr_name.len>0 && c!=0) { +@@ -211,7 +211,7 @@ static inline int no_contacts(sip_msg_t *_m, udomain_t* _d, str* _a, str* _h) + { + urecord_t* r; + int res; +- ++ + ul.lock_udomain(_d, _a); + res = ul.get_urecord(_d, _a, &r); + if (res < 0) { +@@ -220,7 +220,7 @@ static inline int no_contacts(sip_msg_t *_m, udomain_t* _d, str* _a, str* _h) + ul.unlock_udomain(_d, _a); + return -1; + } +- ++ + if (res == 0) { /* Contacts found */ + build_contact(_m, r->contacts, _h); + ul.release_urecord(r); +@@ -280,7 +280,7 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c, unsig + + /* set tcp connection id */ + if (_m->rcv.proto==PROTO_TCP || _m->rcv.proto==PROTO_TLS +- || _m->rcv.proto==PROTO_WS || _m->rcv.proto==PROTO_WSS) { ++ || _m->rcv.proto==PROTO_WS || _m->rcv.proto==PROTO_WSS) { + ci.tcpconn_id = _m->rcv.proto_reserved1; + } else { + ci.tcpconn_id = -1; +@@ -288,7 +288,7 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c, unsig + + /* additional info from message */ + if (parse_headers(_m, HDR_USERAGENT_F, 0) != -1 && _m->user_agent && +- _m->user_agent->body.len>0 && _m->user_agent->body.lenuser_agent->body.len>0 && _m->user_agent->body.lenuser_agent->body; + } else { + ci.user_agent = &no_ua; +@@ -379,8 +379,8 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c, unsig + if (received_found==0) { + memset(&val, 0, sizeof(int_str)); + if (rcv_avp_name.n!=0 +- && search_first_avp(rcv_avp_type, rcv_avp_name, &val, 0) +- && val.s.len > 0) { ++ && search_first_avp(rcv_avp_type, rcv_avp_name, &val, 0) ++ && val.s.len > 0) { + if (val.s.len>RECEIVED_MAX_SIZE) { + rerrno = R_CONTACT_LEN; + LM_ERR("received too long\n"); +@@ -574,13 +574,13 @@ error: + + + static int test_max_contacts(struct sip_msg* _m, urecord_t* _r, contact_t* _c, +- ucontact_info_t *ci, int mc) ++ ucontact_info_t *ci, int mc) + { + int num; + int e; + ucontact_t* ptr, *cont; + int ret; +- ++ + num = 0; + ptr = _r->contacts; + while(ptr) { +@@ -590,7 +590,7 @@ static int test_max_contacts(struct sip_msg* _m, urecord_t* _r, contact_t* _c, + ptr = ptr->next; + } + LM_DBG("%d valid contacts\n", num); +- ++ + for( ; _c ; _c = get_next_contact(_c) ) { + /* calculate expires */ + calc_contact_expires(_m, _c->expires, &e); +@@ -610,7 +610,7 @@ static int test_max_contacts(struct sip_msg* _m, urecord_t* _r, contact_t* _c, + if (e == 0) num--; + } + } +- ++ + LM_DBG("%d contacts after commit\n", num); + if (num > mc) { + LM_INFO("too many contacts for AOR <%.*s>\n", _r->aor.len, _r->aor.s); +@@ -668,7 +668,7 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r, int _mode, + + #ifdef USE_TCP + if ( (_m->flags&tcp_persistent_flag) && +- (_m->rcv.proto==PROTO_TCP||_m->rcv.proto==PROTO_TLS||_m->rcv.proto==PROTO_WS||_m->rcv.proto==PROTO_WSS)) { ++ (_m->rcv.proto==PROTO_TCP||_m->rcv.proto==PROTO_TLS||_m->rcv.proto==PROTO_WS||_m->rcv.proto==PROTO_WSS)) { + e_max = -1; + tcp_check = 1; + } else { +@@ -756,15 +756,15 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r, int _mode, + /* If call-id has changed then delete all records with this sip.instance + then insert new record */ + if (ci->instance.s != NULL && +- (ci->callid->len != c->callid.len || +- strncmp(ci->callid->s, c->callid.s, ci->callid->len) != 0)) ++ (ci->callid->len != c->callid.len || ++ strncmp(ci->callid->s, c->callid.s, ci->callid->len) != 0)) + { + ptr = _r->contacts; + while (ptr) + { + ptr0 = ptr->next; + if ((ptr != c) && ptr->instance.len == c->instance.len && +- strncmp(ptr->instance.s, c->instance.s, ptr->instance.len) == 0) ++ strncmp(ptr->instance.s, c->instance.s, ptr->instance.len) == 0) + { + ul.delete_ucontact(_r, ptr); + } +@@ -912,12 +912,12 @@ int save(struct sip_msg* _m, udomain_t* _d, int _cflags, str *_uri) + } + + if (reg_outbound_mode != REG_OUTBOUND_NONE +- && !(parse_headers(_m, HDR_VIA2_F, 0) == -1 || _m->via2 == 0 +- || _m->via2->error != PARSE_OK)) { ++ && !(parse_headers(_m, HDR_VIA2_F, 0) == -1 || _m->via2 == 0 ++ || _m->via2->error != PARSE_OK)) { + /* Outbound supported on server, and more than one Via: - not the first hop */ + + if (!(parse_headers(_m, HDR_PATH_F, 0) == -1 || _m->path == 0)) { +- route = (rr_t *)0; ++ route = (rr_t *)0; + if (parse_rr_body(_m->path->body.s, _m->path->body.len, &route) < 0) { + LM_ERR("Failed to parse Path: header body\n"); + goto error; +@@ -949,7 +949,7 @@ int save(struct sip_msg* _m, udomain_t* _d, int _cflags, str *_uri) + + if ((use_ob == 0) && (reg_regid_mode == REG_REGID_OUTBOUND)) { + if ((get_supported(_m) & F_OPTION_TAG_OUTBOUND) +- && contact->reg_id) { ++ && contact->reg_id) { + LM_WARN("Outbound used by UAC but not supported by edge proxy\n"); + rerrno = R_OB_UNSUP_EDGE; + goto error; +@@ -959,7 +959,7 @@ int save(struct sip_msg* _m, udomain_t* _d, int _cflags, str *_uri) + } + } + } +- ++ + get_act_time(); + c = get_first_contact(_m); + +@@ -1012,9 +1012,9 @@ int unregister(struct sip_msg* _m, udomain_t* _d, str* _uri, str *_ruid) + if (_ruid == NULL) { + /* No ruid provided - remove all contacts for aor */ + +- if (extract_aor(_uri, &aor, NULL) < 0) { +- LM_ERR("failed to extract Address Of Record\n"); +- return -1; ++ if (extract_aor(_uri, &aor, NULL) < 0) { ++ LM_ERR("failed to extract Address Of Record\n"); ++ return -1; + } + + u = parse_to_uri(_m); +@@ -1029,36 +1029,37 @@ int unregister(struct sip_msg* _m, udomain_t* _d, str* _uri, str *_ruid) + } else { + /* ruid provided - remove a specific contact */ + +- if (_uri->len > 0) { ++ if (_uri->len > 0) { + +- if (extract_aor(_uri, &aor, NULL) < 0) { +- LM_ERR("failed to extract Address Of Record\n"); +- return -1; +- } ++ if (extract_aor(_uri, &aor, NULL) < 0) { ++ LM_ERR("failed to extract Address Of Record\n"); ++ return -1; ++ } + +- if (ul.get_urecord_by_ruid(_d, ul.get_aorhash(&aor), +- _ruid, &r, &c) != 0) { +- LM_WARN("AOR/Contact not found\n"); +- return -1; ++ if (ul.get_urecord_by_ruid(_d, ul.get_aorhash(&aor), ++ _ruid, &r, &c) != 0) { ++ LM_WARN("AOR/Contact not found\n"); ++ return -1; + } + if (ul.delete_ucontact(r, c) != 0) { +- LM_WARN("could not delete contact\n"); +- return -1; ++ ul.unlock_udomain(_d, &aor); ++ LM_WARN("could not delete contact\n"); ++ return -1; + } + ul.unlock_udomain(_d, &aor); + + } else { + +- res = ul.delete_urecord_by_ruid(_d, _ruid); ++ res = ul.delete_urecord_by_ruid(_d, _ruid); + switch (res) { +- case -1: +- LM_ERR("could not delete contact\n"); +- return -1; +- case -2: +- LM_WARN("contact not found\n"); +- return -1; +- default: +- return 1; ++ case -1: ++ LM_ERR("could not delete contact\n"); ++ return -1; ++ case -2: ++ LM_WARN("contact not found\n"); ++ return -1; ++ default: ++ return 1; + } + + } +-- +1.8.4.3 + diff --git a/debian/patches/upstream/0009-usrloc-avoid-double-locking-when-preloading-attribut.patch b/debian/patches/upstream/0009-usrloc-avoid-double-locking-when-preloading-attribut.patch new file mode 100644 index 000000000..f530bf474 --- /dev/null +++ b/debian/patches/upstream/0009-usrloc-avoid-double-locking-when-preloading-attribut.patch @@ -0,0 +1,40 @@ +From 8df9d2336e7de2648288cf8ff6821e6820d88da9 Mon Sep 17 00:00:00 2001 +From: Daniel-Constantin Mierla +Date: Mon, 9 Dec 2013 10:06:15 +0100 +Subject: [PATCH] usrloc: avoid double locking when preloading attributes + +- reported by Seudin Kasumovic, FS#378 + +(cherry picked from commit 888635bfa3719afeeea6f5f0d407aa862ceb34ac) +--- + modules/usrloc/udomain.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/modules/usrloc/udomain.c b/modules/usrloc/udomain.c +index a736051..88fc7e4 100644 +--- a/modules/usrloc/udomain.c ++++ b/modules/usrloc/udomain.c +@@ -1270,8 +1270,7 @@ int uldb_preload_attrs(udomain_t *_d) + suri = user; + } + +- lock_udomain(_d, &suri); +- if (get_urecord_by_ruid(_d, ul_get_aorhash(&suri), &ruid, &r, &c) > 0) { ++ if (get_urecord_by_ruid(_d, ul_get_aorhash(&suri), &ruid, &r, &c) < 0) { + /* delete attrs records from db table */ + LM_INFO("no contact record for this ruid\n"); + uldb_delete_attrs(_d->name, &user, &domain, &ruid); +@@ -1287,8 +1286,9 @@ int uldb_preload_attrs(udomain_t *_d) + LM_INFO("cannot add values to contact xavp\n"); + } + } ++ /* get_urecord_by_ruid() locks the slot */ ++ unlock_udomain(_d, &suri); + } +- unlock_udomain(_d, &user); + } + + if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) { +-- +1.8.4.3 +