From 76394a727f5b18fbb0506ddcecfa6494d7cff31c Mon Sep 17 00:00:00 2001 From: Matthew Jordan Date: Wed, 23 Nov 2011 16:23:34 +0000 Subject: Fixed SendMessage stripping extension from To: header in SIP MESSAGE When using the MessageSend application to send a SIP MESSAGE to a non-peer, chan_sip attempted to validate the hostname or IP Address. In the process, it stripped off the extension and failed to add it back to the sip_pvt structure before transmitting. This patch adds the full URI passed in from the message core to the sip_pvt structure. (closes issue ASTERISK-18903) Reported by: Shaun Clark Tested by: Matt Jordan Review: https://reviewboard.asterisk.org/r/1597/ ........ Merged revisions 346040 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@346053 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 2eecb0a6a..a76caa89e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -24315,20 +24315,25 @@ static int sip_msg_send(const struct ast_msg *msg, const char *to, const char *f { struct sip_pvt *pvt; int res; - char *peer; + char *uri, *host; struct sip_peer *peer_ptr; if (!(pvt = sip_alloc(NULL, NULL, 0, SIP_MESSAGE, NULL))) { return -1; } - peer = ast_strdupa(to); - if (strchr(peer, '@')) { - strsep(&peer, "@"); - } else { - strsep(&peer, ":"); + uri = ast_strdupa(to); + if (!strncasecmp(uri, "sip:", 4)) { + uri += 4; + } else if (!strncasecmp(uri, "sips:", 5)) { + uri += 5; } - if (ast_strlen_zero(peer)) { + host = ast_strdupa(uri); + if (strchr(host, '@')) { + strsep(&host, "@"); + } + + if (ast_strlen_zero(host)) { ast_log(LOG_WARNING, "MESSAGE(to) is invalid for SIP - '%s'\n", to); dialog_unlink_all(pvt); dialog_unref(pvt, "MESSAGE(to) is invalid for SIP"); @@ -24364,12 +24369,16 @@ static int sip_msg_send(const struct ast_msg *msg, const char *to, const char *f sip_pvt_lock(pvt); - if (create_addr(pvt, peer, NULL, TRUE, NULL)) { + /* Look up the host to contact */ + if (create_addr(pvt, host, NULL, TRUE, NULL)) { sip_pvt_unlock(pvt); dialog_unlink_all(pvt); dialog_unref(pvt, "create_addr failed sending a MESSAGE"); return -1; } + + /* Set the tohost to the full URI provided */ + ast_string_field_set(pvt, tohost, uri); ast_sip_ouraddrfor(&pvt->sa, &pvt->ourip, pvt); ast_set_flag(&pvt->flags[0], SIP_OUTGOING); -- cgit v1.2.3