diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-11 00:30:26 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-11 00:30:26 +0000 |
commit | 9f2da11ca922a1481d0aa7c151d048333144be61 (patch) | |
tree | 557c6a96c34f0e7b7b25ca1c82353a65f66ac343 /channels | |
parent | 1dfbe11d44775a8b3683c87744136f9988cbaa53 (diff) |
Fix incorrect tag checking on transfers when pedantic=yes is enabled.
(closes issue #14611)
Reported by: klaus3000
Patches:
patch_chan_sip_attended_transfer_1.4.23.txt uploaded by klaus3000 (license 65)
Tested by: klaus3000
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@181029 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 799355cb9..812009892 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -9215,34 +9215,43 @@ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *t ast_mutex_lock(&iflock); - if (option_debug > 3 && totag) + if (option_debug > 3 && totag) { ast_log(LOG_DEBUG, "Looking for callid %s (fromtag %s totag %s)\n", callid, fromtag ? fromtag : "<no fromtag>", totag ? totag : "<no totag>"); + } /* Search interfaces and find the match */ for (sip_pvt_ptr = iflist; sip_pvt_ptr; sip_pvt_ptr = sip_pvt_ptr->next) { if (!strcmp(sip_pvt_ptr->callid, callid)) { int match = 1; + if (option_debug > 3) + ast_log(LOG_DEBUG, "Found call with callid %s (ourtag=%s, theirtag=%s)\n", callid, sip_pvt_ptr->tag, sip_pvt_ptr->theirtag); + /* Go ahead and lock it (and its owner) before returning */ ast_mutex_lock(&sip_pvt_ptr->lock); /* Check if tags match. If not, this is not the call we want - (With a forking SIP proxy, several call legs share the - call id, but have different tags) - */ + * (With a forking SIP proxy, several call legs share the + * call id, but have different tags) + */ if (pedanticsipchecking) { const char *pvt_fromtag, *pvt_totag; - if (ast_test_flag(&sip_pvt_ptr->flags[1], SIP_PAGE2_OUTGOING_CALL)) { - /* Outgoing call tags : from is "our", to is "their" */ - pvt_fromtag = sip_pvt_ptr->tag ; - pvt_totag = sip_pvt_ptr->theirtag ; - } else { - /* Incoming call tags : from is "their", to is "our" */ - pvt_fromtag = sip_pvt_ptr->theirtag ; - pvt_totag = sip_pvt_ptr->tag ; - } - if (ast_strlen_zero(fromtag) || strcmp(fromtag, pvt_fromtag) || (!ast_strlen_zero(totag) && strcmp(totag, pvt_totag))) + /* RFC 3891 + * > 3. User Agent Server Behavior: Receiving a Replaces Header + * > The Replaces header contains information used to match an existing + * > SIP dialog (call-id, to-tag, and from-tag). Upon receiving an INVITE + * > with a Replaces header, the User Agent (UA) attempts to match this + * > information with a confirmed or early dialog. The User Agent Server + * > (UAS) matches the to-tag and from-tag parameters as if they were tags + * > present in an incoming request. In other words, the to-tag parameter + * > is compared to the local tag, and the from-tag parameter is compared + * > to the remote tag. + * + * Thus, the totag is always compared to the local tag, regardless if + * this our call is an incoming or outgoing call. + */ + if (ast_strlen_zero(fromtag) || strcmp(fromtag, sip_pvt_ptr->theirtag) || (!ast_strlen_zero(totag) && strcmp(totag, sip_pvt_ptr->tag))) match = 0; } |