diff options
author | Mark Michelson <mmichelson@digium.com> | 2008-08-27 20:11:22 +0000 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2008-08-27 20:11:22 +0000 |
commit | f150dfb95a2276f056441880ba898a43b4c94891 (patch) | |
tree | 7c430b3cfc6d1f1a88c880286b50d644b2f48887 | |
parent | 3aca08d9247c00124c00da81ff2e3d9b36c2da57 (diff) |
Merged revisions 140299 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r140299 | mmichelson | 2008-08-27 14:49:20 -0500 (Wed, 27 Aug 2008) | 11 lines
Fix tag checking in get_sip_pvt_byid_locked when
in pedantic mode. The problem was that the wrong
tags would be compared depending on the direction
of the call.
(closes issue #13353)
Reported by: flefoll
Patches:
chan_sip.c.br14.139015.patch-refer-pedantic uploaded by flefoll (license 244)
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@140301 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_sip.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a96b3c425..681f97059 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -11216,9 +11216,6 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq) } /*! \brief Lock dialog lock and find matching pvt lock - - Their tag is fromtag, our tag is to-tag - - This means that in some transactions, totag needs to be their tag :-) - depending upon the direction \return a reference, remember to release it when done */ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag) @@ -11235,21 +11232,32 @@ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *t sip_pvt_ptr = ao2_t_find(dialogs, &tmp_dialog, OBJ_POINTER, "ao2_find of dialog in dialogs table"); if (sip_pvt_ptr) { - char *ourtag = sip_pvt_ptr->tag; /* Go ahead and lock it (and its owner) before returning */ sip_pvt_lock(sip_pvt_ptr); - - if (pedanticsipchecking && (strcmp(fromtag, sip_pvt_ptr->theirtag) || (!ast_strlen_zero(totag) && strcmp(totag, ourtag)))) { - sip_pvt_unlock(sip_pvt_ptr); - ast_debug(4, "Matched %s call for callid=%s - But the pedantic check rejected the match; their tag is %s Our tag is %s\n", - ast_test_flag(&sip_pvt_ptr->flags[0], SIP_OUTGOING) ? "OUTGOING": "INCOMING", sip_pvt_ptr->callid, - sip_pvt_ptr->theirtag, sip_pvt_ptr->tag); - return 0; + if (pedanticsipchecking) { + const char *pvt_fromtag, *pvt_totag; + + if (sip_pvt_ptr->outgoing_call == TRUE) { + /* 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))) { + sip_pvt_unlock(sip_pvt_ptr); + ast_debug(4, "Matched %s call for callid=%s - But the pedantic check rejected the match; their tag is %s Our tag is %s\n", + sip_pvt_ptr->outgoing_call == TRUE ? "OUTGOING": "INCOMING", sip_pvt_ptr->callid, + sip_pvt_ptr->theirtag, sip_pvt_ptr->tag); + return NULL; + } } if (totag) ast_debug(4, "Matched %s call - their tag is %s Our tag is %s\n", - ast_test_flag(&sip_pvt_ptr->flags[0], SIP_OUTGOING) ? "OUTGOING": "INCOMING", + sip_pvt_ptr->outgoing_call == TRUE ? "OUTGOING": "INCOMING", sip_pvt_ptr->theirtag, sip_pvt_ptr->tag); /* deadlock avoidance... */ |