]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 119008 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Thu, 29 May 2008 18:49:12 +0000 (18:49 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 29 May 2008 18:49:12 +0000 (18:49 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r119008 | russell | 2008-05-29 13:45:21 -0500 (Thu, 29 May 2008) | 7 lines

Merge changes from team/russell/iax2-another-fix-to-the-fix

As described in the following post to the asterisk-dev mailing list, only
enforce destination call numbers when processing an ACK.

http://lists.digium.com/pipermail/asterisk-dev/2008-May/033217.html

(closes issue #12631)
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@119009 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_iax2.c

index a68f336e2b835d0ce42ee148b985800e43070834..4f2ad60f135f4da1fb2c386880bccbb244eb82db 100644 (file)
@@ -1413,13 +1413,13 @@ static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
 #define NEW_ALLOW      1
 #define NEW_FORCE      2
 
-static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, struct chan_iax2_pvt *cur, int full_frame)
+static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, struct chan_iax2_pvt *cur, int check_dcallno)
 {
        if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
                (cur->addr.sin_port == sin->sin_port)) {
                /* This is the main host */
                if ( (cur->peercallno == 0 || cur->peercallno == callno) &&
-                        (full_frame ? dcallno == cur->callno : 1) ) {
+                        (check_dcallno ? dcallno == cur->callno : 1) ) {
                        /* That's us.  Be sure we keep track of the peer call number */
                        return 1;
                }
@@ -1496,7 +1496,7 @@ static int make_trunk(unsigned short callno, int locked)
 /*!
  * \note Calling this function while holding another pvt lock can cause a deadlock.
  */
-static int __find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int return_locked, int full_frame)
+static int __find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int return_locked, int check_dcallno)
 {
        int res = 0;
        int x;
@@ -1510,7 +1510,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
                                .callno = dcallno,
                                .peercallno = callno,
                                /* hack!! */
-                               .frames_received = full_frame,
+                               .frames_received = check_dcallno,
                        };
  
                        memcpy(&tmp_pvt.addr, sin, sizeof(tmp_pvt.addr));
@@ -1531,7 +1531,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
                        ast_mutex_lock(&iaxsl[x]);
                        if (iaxs[x]) {
                                /* Look for an exact match */
-                               if (match(sin, callno, dcallno, iaxs[x], full_frame)) {
+                               if (match(sin, callno, dcallno, iaxs[x], check_dcallno)) {
                                        res = x;
                                }
                        }
@@ -1542,7 +1542,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
                        ast_mutex_lock(&iaxsl[x]);
                        if (iaxs[x]) {
                                /* Look for an exact match */
-                               if (match(sin, callno, dcallno, iaxs[x], full_frame)) {
+                               if (match(sin, callno, dcallno, iaxs[x], check_dcallno)) {
                                        res = x;
                                }
                        }
@@ -7127,8 +7127,10 @@ static int socket_process(struct iax2_thread *thread)
                f.subclass = 0;
        }
 
-       if (!fr->callno)
-               fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, fd, ntohs(mh->callno) & IAX_FLAG_FULL);
+       if (!fr->callno) {
+               fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, fd, 
+                       (ntohs(mh->callno) & IAX_FLAG_FULL) && f.frametype == AST_FRAME_IAX && f.subclass == IAX_COMMAND_ACK);
+       }
 
        if (fr->callno > 0)
                ast_mutex_lock(&iaxsl[fr->callno]);