From: Mark Michelson Date: Tue, 23 Sep 2008 15:37:00 +0000 (+0000) Subject: When a promiscuous redirect contained both a user and X-Git-Tag: 1.6.2.0-beta1~1258 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8625eb9d2a5ae3bdf3cd8a053763e3a40ec5bc1e;p=thirdparty%2Fasterisk.git When a promiscuous redirect contained both a user and host portion in the Contact URI and specifies a transport, the parsing done in parse_moved_contact resulted in a malformed URI. This commit fixes the parsing so that a proper Dial string may be formed when the forwarded call is placed. (closes issue #13523) Reported by: mattdarnell Patches: 13523v2.patch uploaded by putnopvut (license 60) Tested by: mattdarnell git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@144025 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 7b1f0b13fd..e26bdc3fe0 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -15095,6 +15095,7 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req) p->socket.type = transport; if (ast_test_flag(&p->flags[0], SIP_PROMISCREDIR)) { + char *host = NULL; if (!strncasecmp(s, "sip:", 4)) s += 4; else if (!strncasecmp(s, "sips:", 5)) @@ -15102,9 +15103,16 @@ static void parse_moved_contact(struct sip_pvt *p, struct sip_request *req) e = strchr(s, '/'); if (e) *e = '\0'; - ast_debug(2, "Found promiscuous redirection to 'SIP/::::%s@%s'\n", get_transport(transport), s); - if (p->owner) - ast_string_field_build(p->owner, call_forward, "SIP/::::%s@%s", get_transport(transport), s); + if ((host = strchr(s, '@'))) { + *host++ = '\0'; + ast_debug(2, "Found promiscuous redirection to 'SIP/%s::::%s@%s'\n", s, get_transport(transport), host); + if (p->owner) + ast_string_field_build(p->owner, call_forward, "SIP/%s::::%s@%s", s, get_transport(transport), host); + } else { + ast_debug(2, "Found promiscuous redirection to 'SIP/::::%s@%s'\n", get_transport(transport), s); + if (p->owner) + ast_string_field_build(p->owner, call_forward, "SIP/::::%s@%s", get_transport(transport), s); + } } else { e = strchr(tmp, '@'); if (e) {