When a promiscuous redirect contained both a user and
authorMark Michelson <mmichelson@digium.com>
Tue, 23 Sep 2008 15:37:00 +0000 (15:37 +0000)
committerMark Michelson <mmichelson@digium.com>
Tue, 23 Sep 2008 15:37:00 +0000 (15:37 +0000)
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

channels/chan_sip.c

index 7b1f0b1..e26bdc3 100644 (file)
@@ -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) {