Module: sip-router
Branch: master
Commit: 3ff9594a30eff2d18e6ea0595c5f82f878eaca1c
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3ff9594…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Juha Heinanen <jh(a)tutpro.com>
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;
}