summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2012-06-19 15:44:42 +0000
committerMark Michelson <mmichelson@digium.com>2012-06-19 15:44:42 +0000
commit91157d5c2bdbc9eb44b799fde0df0841a34bfa4c (patch)
tree102709c50659195ffd162f5b0ac98817ace5e9dd /channels
parentd73a1de0b1c9a210e389109d6873408c606b0e1a (diff)
Fix request routing issue when outboundproxy is used.
Asterisk was incorrectly setting the destination of CANCELs and ACKs for error responses to the URI of the initial INVITE. This resulted in further requests, such as INVITEs with authentication credentials, to be routed incorrectly. Instead, when these CANCEL or ACKs are to be sent, we should simply keep the destination the same as what it previously was. There is no need to alter it any. (closes issue ASTERISK-20008) Reported by Marcus Hunger Patches: ASTERISK-20008.patch uploaded by Mark Michelson (license #5049) ........ Merged revisions 369066 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 369067 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@369068 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index d913b938d..563350cb9 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -10928,10 +10928,9 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, ui
* final response. For a CANCEL or ACK, we have to send to the same destination
* as the original INVITE.
*/
- if (sipmethod == SIP_CANCEL ||
- (sipmethod == SIP_ACK && (p->invitestate == INV_COMPLETED || p->invitestate == INV_CANCELLED))) {
- set_destination(p, ast_strdupa(p->uri));
- } else if (p->route) {
+ if (p->route &&
+ !(sipmethod == SIP_CANCEL ||
+ (sipmethod == SIP_ACK && (p->invitestate == INV_COMPLETED || p->invitestate == INV_CANCELLED)))) {
set_destination(p, p->route->hop);
add_route(req, is_strict ? p->route->next : p->route);
}