Merged revisions 140299 via svnmerge from
authorMark Michelson <mmichelson@digium.com>
Wed, 27 Aug 2008 20:11:22 +0000 (20:11 +0000)
committerMark Michelson <mmichelson@digium.com>
Wed, 27 Aug 2008 20:11:22 +0000 (20:11 +0000)
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

channels/chan_sip.c

index a96b3c4..681f970 100644 (file)
@@ -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... */