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

Reply via email to