Hi Juha!
Thanks for the fix, the new version works fine for me.
Nevertheless, I get lots of warnings:
gcc -fPIC -DPIC -g -O9 -funroll-loops -Wcast-align -m32
-minline-all-stringops -falign-loops -ftree-vectorize
-fno-strict-overflow -mtune=athlon64 -Wall -DNAME='"ser"'
-DVERSION='"2.99.99-pre3"' -DARCH='"i386"'
-DOS='linux_'
-DOS_QUOTED='"linux"' -DCOMPILER='"gcc 4.3.2"'
-D__CPU_i386 -D__OS_linux
-DSER_VER=2099099 -DCFG_DIR='"/usr/local/etc/ser/"' -DPKG_MALLOC
-DSHM_MEM -DSHM_MMAP -DDNS_IP_HACK -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP
-DDISABLE_NAGLE -DHAVE_RESOLV_RES -DUSE_DNS_CACHE -DUSE_DNS_FAILOVER
-DUSE_DST_BLACKLIST -DUSE_NAPTR -DDBG_QM_MALLOC -DUSE_TLS -DTLS_HOOKS
-DFAST_LOCK -DADAPTIVE_WAIT -DADAPTIVE_WAIT_LOOPS=1024 -DCC_GCC_LIKE_ASM
-DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD
-DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H
-DHAVE_TIMEGM -DHAVE_SCHED_SETSCHEDULER -DHAVE_EPOLL -DHAVE_SIGIO_RT
-DSIGINFO64_WORKARROUND -DUSE_FUTEX -DHAVE_SELECT
-DOPENSER_MOD_INTERFACE -DMOD_NAME='"nathelper"' -c nathelper.c -o
nathelper.o
nathelper.c: In function 'pv_get_rr_top_count_f':
nathelper.c:1647: warning: unused variable 'header'
nathelper.c:1646: warning: unused variable 'count'
nathelper.c: At top level:
nathelper.c:286: warning: 'rr_count_f' declared 'static' but never
defined
nathelper.c:287: warning: 'rr_top_count_f' declared 'static' but never
defined
regards
Klaus
Juha Heinanen schrieb:
Module: sip-router
Branch: sr_3.0
Commit: 9d98ca32bb131c0fb190e012ed0bff3f9a26557a
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=9d98ca3…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Juha Heinanen <jh(a)tutpro.com>
Date: Wed Dec 30 12:19:03 2009 +0200
modules_k/nathelper: handle_uri_alias() alias handling fix
- handle_uri_alias() now finds ;alias r-uri param even if it is not
the first param.
---
modules_k/nathelper/nathelper.c | 53 ++++++++++++++++++++++++--------------
1 files changed, 33 insertions(+), 20 deletions(-)
diff --git a/modules_k/nathelper/nathelper.c b/modules_k/nathelper/nathelper.c
index fadc93f..27ef349 100644
--- a/modules_k/nathelper/nathelper.c
+++ b/modules_k/nathelper/nathelper.c
@@ -1501,41 +1501,54 @@ add_contact_alias_f(struct sip_msg* msg, char* str1, char* str2)
static int
handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
{
- str params, uri, proto;
- char buf[MAX_URI_SIZE], *val, *sep, *trans, *at, *next, *cur_uri;
- unsigned int len, plen, alias_len, proto_type, cur_uri_len;
+ str uri, proto;
+ char buf[MAX_URI_SIZE], *val, *sep, *trans, *at, *next, *cur_uri, *rest;
+ unsigned int len, rest_len, val_len, alias_len, proto_type, cur_uri_len,
+ ip_port_len;
if ((msg->parsed_uri_ok == 0) && (parse_sip_msg_uri(msg) < 0)) {
LM_ERR("while parsing Request-URI\n");
return -1;
}
- params = msg->parsed_uri.params;
- if (params.len == 0) {
+ rest = msg->parsed_uri.params.s;
+ rest_len = msg->parsed_uri.params.len;
+ if (rest_len == 0) {
LM_DBG("no params\n");
return 2;
}
- if ((params.len < ALIAS_LEN) ||
- (strncmp(params.s, ALIAS, ALIAS_LEN) != 0)) {
+ while (rest_len >= ALIAS_LEN) {
+ if (strncmp(rest, ALIAS, ALIAS_LEN) == 0) break;
+ sep = memchr(rest, 59 /* ; */, rest_len);
+ if (sep == NULL) {
+ LM_DBG("no alias param\n");
+ return 2;
+ } else {
+ rest_len = rest_len - (sep - rest + 1);
+ rest = sep + 1;
+ }
+ }
+
+ if (rest_len < ALIAS_LEN) {
LM_DBG("no alias param\n");
return 2;
}
/* set dst uri based on alias param value */
- val = params.s + ALIAS_LEN;
- plen = params.len - ALIAS_LEN;
- sep = memchr(val, 116 /* t */, plen);
+ val = rest + ALIAS_LEN;
+ val_len = rest_len - ALIAS_LEN;
+ sep = memchr(val, 116 /* t */, val_len);
if (sep == NULL) {
- LM_ERR("no 't' in alias param\n");
+ LM_ERR("no 't' in alias param value\n");
return -1;
}
at = &(buf[0]);
append_str(at, "sip:", 4);
- len = sep - val;
- alias_len = SALIAS_LEN + len + 2 /* tn */;
- memcpy(at, val, len);
- at = at + len;
+ ip_port_len = sep - val;
+ alias_len = SALIAS_LEN + ip_port_len + 2 /* tn */;
+ memcpy(at, val, ip_port_len);
+ at = at + ip_port_len;
trans = sep + 1;
- if ((len + 2 > plen) || (*trans == ';') || (*trans == '?')) {
+ if ((ip_port_len + 2 > val_len) || (*trans == ';') || (*trans ==
'?')) {
LM_ERR("no proto in alias param\n");
return -1;
}
@@ -1543,7 +1556,7 @@ handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
if (proto_type != PROTO_UDP) {
proto_type_to_str(proto_type, &proto);
if (proto.len == 0) {
- LM_ERR("unkown proto in alias param\n");
+ LM_ERR("unknown proto in alias param\n");
return -1;
}
append_str(at, ";transport=", 11);
@@ -1551,7 +1564,7 @@ handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
at = at + proto.len;
}
next = trans + 1;
- if ((len + 2 < plen) && (*next != ';') && (*next !=
'?')) {
+ if ((ip_port_len + 2 < val_len) && (*next != ';') &&
(*next != '?')) {
LM_ERR("invalid alias param value\n");
return -1;
}
@@ -1572,11 +1585,11 @@ handle_ruri_alias_f(struct sip_msg* msg, char* str1, char* str2)
cur_uri_len = msg->first_line.u.request.uri.len;
}
at = &(buf[0]);
- len = params.s - 1 /* ; */ - cur_uri;
+ len = rest - 1 /* ; */ - cur_uri;
memcpy(at, cur_uri, len);
at = at + len;
len = cur_uri_len - alias_len - len;
- memcpy(at, params.s + alias_len - 1, len);
+ memcpy(at, rest + alias_len - 1, len);
uri.s = &(buf[0]);
uri.len = cur_uri_len - alias_len;
LM_DBG("rewriting r-uri to <%.*s>\n", uri.len, uri.s);
_______________________________________________
sr-dev mailing list
sr-dev(a)lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev