Merged revisions 279887 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r279887 | mmichelson | 2010-07-27 13:54:07 -0500 (Tue, 27 Jul 2010) | 16 lines Fix parsing error in sip_sipredirect(). The code was written in a way that did a bad job of parsing the port out of a URI. Specifically, it would do badly when dealing with an IPv6 address. In this particular scenario, there was no value from parsing the port out, so I just removed that logic. And while I was messing around in the function, I changed some variable names to be more descriptive. (closes issue #17661) Reported by: oej Patches: 17661.diff uploaded by mmichelson (license 60) ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@279888 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
parent
332a4ed3fc
commit
eecac589ec
|
@ -27462,49 +27462,44 @@ static int sip_removeheader(struct ast_channel *chan, const char *data)
|
|||
static int sip_sipredirect(struct sip_pvt *p, const char *dest)
|
||||
{
|
||||
char *cdest;
|
||||
char *extension, *host, *port;
|
||||
char tmp[80];
|
||||
char *extension, *domain;
|
||||
|
||||
cdest = ast_strdupa(dest);
|
||||
|
||||
extension = strsep(&cdest, "@");
|
||||
host = strsep(&cdest, ":");
|
||||
port = strsep(&cdest, ":");
|
||||
domain = strsep(&cdest, ":");
|
||||
if (ast_strlen_zero(extension)) {
|
||||
ast_log(LOG_ERROR, "Missing mandatory argument: extension\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* we'll issue the redirect message here */
|
||||
if (!host) {
|
||||
char *localtmp;
|
||||
if (!domain) {
|
||||
char *local_to_header;
|
||||
char to_header[256];
|
||||
|
||||
ast_copy_string(tmp, get_header(&p->initreq, "To"), sizeof(tmp));
|
||||
if (ast_strlen_zero(tmp)) {
|
||||
ast_copy_string(to_header, get_header(&p->initreq, "To"), sizeof(to_header));
|
||||
if (ast_strlen_zero(to_header)) {
|
||||
ast_log(LOG_ERROR, "Cannot retrieve the 'To' header from the original SIP request!\n");
|
||||
return 0;
|
||||
}
|
||||
if ( ( (localtmp = strcasestr(tmp, "sip:")) || (localtmp = strcasestr(tmp, "sips:")) )
|
||||
&& (localtmp = strchr(localtmp, '@'))) {
|
||||
char lhost[80], lport[80];
|
||||
if (((local_to_header = strcasestr(to_header, "sip:")) || (local_to_header = strcasestr(to_header, "sips:")))
|
||||
&& (local_to_header = strchr(local_to_header, '@'))) {
|
||||
char ldomain[256];
|
||||
|
||||
memset(lhost, 0, sizeof(lhost));
|
||||
memset(lport, 0, sizeof(lport));
|
||||
localtmp++;
|
||||
memset(ldomain, 0, sizeof(ldomain));
|
||||
local_to_header++;
|
||||
/* This is okey because lhost and lport are as big as tmp */
|
||||
sscanf(localtmp, "%80[^<>:; ]:%80[^<>:; ]", lhost, lport);
|
||||
if (ast_strlen_zero(lhost)) {
|
||||
sscanf(local_to_header, "%256[^<>; ]", ldomain);
|
||||
if (ast_strlen_zero(ldomain)) {
|
||||
ast_log(LOG_ERROR, "Can't find the host address\n");
|
||||
return 0;
|
||||
}
|
||||
host = ast_strdupa(lhost);
|
||||
if (!ast_strlen_zero(lport)) {
|
||||
port = ast_strdupa(lport);
|
||||
}
|
||||
domain = ast_strdupa(ldomain);
|
||||
}
|
||||
}
|
||||
|
||||
ast_string_field_build(p, our_contact, "Transfer <sip:%s@%s%s%s>", extension, host, port ? ":" : "", port ? port : "");
|
||||
ast_string_field_build(p, our_contact, "Transfer <sip:%s@%s>", extension, domain);
|
||||
transmit_response_reliable(p, "302 Moved Temporarily", &p->initreq);
|
||||
|
||||
sip_scheddestroy(p, SIP_TRANS_TIMEOUT); /* Make sure we stop send this reply. */
|
||||
|
|
Loading…
Reference in New Issue