summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2011-11-23 16:23:34 +0000
committerMatthew Jordan <mjordan@digium.com>2011-11-23 16:23:34 +0000
commit76394a727f5b18fbb0506ddcecfa6494d7cff31c (patch)
tree351c44cf2839189e561ef610278ef1f2d67c92e3
parent6d05a31d9fb890d75acd93a9c8c7e3eaa0bc22e5 (diff)
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
-rw-r--r--channels/chan_sip.c25
1 files 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);