summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2010-07-09 19:46:20 +0000
committerMark Michelson <mmichelson@digium.com>2010-07-09 19:46:20 +0000
commite46325f18c7a2d135422eb8d05bfad8e4e19ec1a (patch)
tree8599f28d99005d654c0a71abcc83acd3aa4bdceb /channels
parentd348c9aa1ea5771b51ad9883420cb41a1fc27b3e (diff)
Fix port parsing in check_via.
If a Via header contained an IPv6 address, we would not properly parse the port. We would instead get the information after the first colon in the address. (closes issue #17614) Reported by: oej Patches: diff uploaded by sperreault (license 252) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@275308 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 435c8520c..ce8a6bfe9 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -14209,7 +14209,9 @@ static attribute_unused void check_via_response(struct sip_pvt *p, struct sip_re
static void check_via(struct sip_pvt *p, struct sip_request *req)
{
char via[512];
- char *c, *pt, *maddr;
+ char *c, *maddr;
+ struct ast_sockaddr tmp;
+ uint16_t port;
ast_copy_string(via, get_header(req, "Via"), sizeof(via));
@@ -14246,15 +14248,15 @@ static void check_via(struct sip_pvt *p, struct sip_request *req)
ast_log(LOG_WARNING, "Don't know how to respond via '%s'\n", via);
return;
}
- pt = strchr(c, ':');
- if (pt)
- *pt++ = '\0'; /* remember port pointer */
if (maddr && ast_sockaddr_resolve_first(&p->sa, maddr, 0)) {
p->sa = p->recv;
}
- ast_sockaddr_set_port(&p->sa, port_str2int(pt, STANDARD_SIP_PORT));
+ ast_sockaddr_resolve_first(&tmp, c, 0);
+ port = ast_sockaddr_port(&tmp);
+ ast_sockaddr_set_port(&p->sa,
+ port != 0 ? port : STANDARD_SIP_PORT);
if (sip_debug_test_pvt(p)) {
ast_verbose("Sending to %s (%s)\n",