Juha, this commit seems to suffer from an off-by-one bug, placing the alias parameter outside the just added <>. Attached commit should fix this. If you agree, i'll commit is asap.
Alex. On Friday 26 November 2010, Juha Heinanen wrote: > Module: sip-router > Branch: master > Commit: 3ff9594a30eff2d18e6ea0595c5f82f878eaca1c > URL: > http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3ff9 > 594a30eff2d18e6ea0595c5f82f878eaca1c > > Author: Juha Heinanen <[email protected]> > Committer: Juha Heinanen <[email protected]> > Date: Fri Nov 26 10:37:30 2010 +0200 > > modules_k/nathelper: add_contact_alias adds <>s around contact URI > > Make sure that Contact URI is surrounded by <> when adding ;alias > parameter. Otherwise, ;alias parameter may be interpreted as header > parameter, because the syntax seems to be ambiguous. > (cherry picked from commit f5ef15fee0c3bf09adf2506effa0895f72af9034) > > --- > > modules_k/nathelper/nathelper.c | 69 > +++++++++++++++++++++++++++++++------- 1 files changed, 56 > insertions(+), 13 deletions(-) > > diff --git a/modules_k/nathelper/nathelper.c > b/modules_k/nathelper/nathelper.c index 51c1086..52c5e5f 100644 > --- a/modules_k/nathelper/nathelper.c > +++ b/modules_k/nathelper/nathelper.c > @@ -786,7 +786,7 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, > char* str2) struct lump *anchor; > struct sip_uri uri; > struct ip_addr *ip; > - char *param, *at, *port, *start; > + char *lt, *gt, *param, *at, *port, *start; > > /* Do nothing if Contact header does not exist */ > if (!msg->contact) { > @@ -816,25 +816,63 @@ add_contact_alias_f(struct sip_msg* msg, char* > str1, char* str2) return 2; > } > > - /* Add alias param */ > + /* Check if function has been called already */ > if ((c->uri.s < msg->buf) || (c->uri.s > (msg->buf + msg->len))) { > LM_ERR("you can't call alias_contact twice, check your config!\n"); > return -1; > } > + > + /* Check if Contact URI needs to be enclosed in <>s */ > + lt = gt = param = NULL; > + at = memchr(msg->contact->body.s, '<', msg->contact->body.len); > + if (at == NULL) { > + lt = (char*)pkg_malloc(1); > + if (!lt) { > + LM_ERR("no pkg memory left for lt sign\n"); > + goto err; > + } > + *lt = '<'; > + anchor = anchor_lump(msg, msg->contact->body.s - msg->buf, 0, 0); > + if (anchor == NULL) { > + LM_ERR("anchor_lump for beginning of contact body failed\n"); > + goto err; > + } > + if (insert_new_lump_before(anchor, lt, 1, 0) == 0) { > + LM_ERR("insert_new_lump_before for \"<\" failed\n"); > + goto err; > + } > + gt = (char*)pkg_malloc(1); > + if (!gt) { > + LM_ERR("no pkg memory left for gt sign\n"); > + goto err; > + } > + *gt = '>'; > + anchor = anchor_lump(msg, msg->contact->body.s + > + msg->contact->body.len - msg->buf, 0, 0); > + if (anchor == NULL) { > + LM_ERR("anchor_lump for end of contact body failed\n"); > + goto err; > + } > + if (insert_new_lump_before(anchor, gt, 1, 0) == 0) { > + LM_ERR("insert_new_lump_before for \">\" failed\n"); > + goto err; > + } > + } > + > + /* Create ;alias param */ > param_len = SALIAS_LEN + IP6_MAX_STR_SIZE + 1 /* ~ */ + 5 /* port */ > + 1 /* ~ */ + 1 /* proto */; > param = (char*)pkg_malloc(param_len); > if (!param) { > LM_ERR("no pkg memory left for alias param\n"); > - return -1; > + goto err; > } > at = param; > append_str(at, SALIAS, SALIAS_LEN); > ip_len = ip_addr2sbuf(&(msg->rcv.src_ip), at, param_len - > SALIAS_LEN); if (ip_len <= 0) { > - pkg_free(param); > LM_ERR("failed to copy source ip\n"); > - return -1; > + goto err; > } > at = at + ip_len; > append_chr(at, '~'); > @@ -842,9 +880,8 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, > char* str2) append_str(at, port, len); > append_chr(at, '~'); > if ((msg->rcv.proto < PROTO_UDP) || (msg->rcv.proto > PROTO_SCTP)) { > - pkg_free(param); > LM_ERR("invalid transport protocol\n"); > - return -1; > + goto err; > } > append_chr(at, msg->rcv.proto + '0'); > param_len = at - param; > @@ -854,18 +891,24 @@ add_contact_alias_f(struct sip_msg* msg, char* > str1, char* str2) } else { > start = uri.host.s + uri.host.len; > } > + > + /* Add ;alias param */ > anchor = anchor_lump(msg, start - msg->buf, 0, 0); > if (anchor == NULL) { > - pkg_free(param); > - LM_ERR("anchor_lump failed\n"); > - return -1; > + LM_ERR("anchor_lump for ;alias param failed\n"); > + goto err; > } > if (insert_new_lump_after(anchor, param, param_len, 0) == 0) { > - LM_ERR("insert_new_lump_after failed\n"); > - pkg_free(param); > - return -1; > + LM_ERR("insert_new_lump_after for ;alias param failed\n"); > + goto err; > } > return 1; > + > + err: > + if (lt) pkg_free(lt); > + if (gt) pkg_free(gt); > + if (param) pkg_free(param); > + return -1; > }
commit 1172423a39ef1bc0da1e205323d15f550377a5ab Author: Alex Hermann <[email protected]> Date: Mon Sep 5 20:40:36 2011 +0200 modules_k/nathelper: Fix add_contact_alias() when contact has no <> Commit 3ff9594a30eff2d18e6ea0595c5f82f878eaca1c added functionality to add <> around the Contact but had an off-by-one bug placing the alias parameter outside the <>. This commit fixes that. diff --git a/modules_k/nathelper/nathelper.c b/modules_k/nathelper/nathelper.c index 35328a3..79b833e 100644 --- a/modules_k/nathelper/nathelper.c +++ b/modules_k/nathelper/nathelper.c @@ -826,6 +826,13 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, char* str2) return -1; } + /* Determine position of alias parameter */ + if (uri.port.len > 0) { + start = uri.port.s + uri.port.len; + } else { + start = uri.host.s + uri.host.len; + } + /* Check if Contact URI needs to be enclosed in <>s */ lt = gt = param = NULL; at = memchr(msg->contact->body.s, '<', msg->contact->body.len); @@ -861,6 +868,8 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, char* str2) LM_ERR("insert_new_lump_before for \">\" failed\n"); goto err; } + /* Position of parameter is shifted now */ + start--; } /* Create ;alias param */ @@ -890,11 +899,6 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, char* str2) append_chr(at, msg->rcv.proto + '0'); param_len = at - param; LM_DBG("adding param <%.*s>\n", param_len, param); - if (uri.port.len > 0) { - start = uri.port.s + uri.port.len; - } else { - start = uri.host.s + uri.host.len; - } /* Add ;alias param */ anchor = anchor_lump(msg, start - msg->buf, 0, 0);
_______________________________________________ sr-dev mailing list [email protected] http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev
