[sr-dev] git:3.1: modules_k/nathelper: add_contact_alias adds <>s around contact URI
Juha Heinanen
jh at tutpro.com
Fri Nov 26 09:42:34 CET 2010
Module: sip-router
Branch: 3.1
Commit: f5ef15fee0c3bf09adf2506effa0895f72af9034
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f5ef15fee0c3bf09adf2506effa0895f72af9034
Author: Juha Heinanen <jh at tutpro.com>
Committer: Juha Heinanen <jh at 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.
---
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 82c6528..dd737a3 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;
}
More information about the sr-dev
mailing list