Merged revisions 119009 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

................
r119009 | russell | 2008-05-29 13:49:12 -0500 (Thu, 29 May 2008) | 16 lines

Merged revisions 119008 via svnmerge from 
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/trunk@119010 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.1
Russell Bryant 17 years ago
parent 9f7209af47
commit 9397f04294

@ -1474,13 +1474,13 @@ static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
#define NEW_ALLOW 1 #define NEW_ALLOW 1
#define NEW_FORCE 2 #define NEW_FORCE 2
static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int full_frame) static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
{ {
if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) && if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
(cur->addr.sin_port == sin->sin_port)) { (cur->addr.sin_port == sin->sin_port)) {
/* This is the main host */ /* This is the main host */
if ( (cur->peercallno == 0 || cur->peercallno == callno) && 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 */ /* That's us. Be sure we keep track of the peer call number */
return 1; return 1;
} }
@ -1592,7 +1592,7 @@ static void remove_by_peercallno(struct chan_iax2_pvt *pvt)
/* /*
* \note Calling this function while holding another pvt lock can cause a deadlock. * \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 res = 0;
int x; int x;
@ -1606,7 +1606,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
.callno = dcallno, .callno = dcallno,
.peercallno = callno, .peercallno = callno,
/* hack!! */ /* hack!! */
.frames_received = full_frame, .frames_received = check_dcallno,
}; };
memcpy(&tmp_pvt.addr, sin, sizeof(tmp_pvt.addr)); memcpy(&tmp_pvt.addr, sin, sizeof(tmp_pvt.addr));
@ -1626,7 +1626,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
ast_mutex_lock(&iaxsl[x]); ast_mutex_lock(&iaxsl[x]);
if (iaxs[x]) { if (iaxs[x]) {
/* Look for an exact match */ /* 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; res = x;
} }
} }
@ -1637,7 +1637,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
ast_mutex_lock(&iaxsl[x]); ast_mutex_lock(&iaxsl[x]);
if (iaxs[x]) { if (iaxs[x]) {
/* Look for an exact match */ /* 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; res = x;
} }
} }
@ -7998,8 +7998,10 @@ static int socket_process(struct iax2_thread *thread)
f.subclass = 0; f.subclass = 0;
} }
if (!fr->callno) if (!fr->callno) {
fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, fd, ntohs(mh->callno) & IAX_FLAG_FULL); 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) if (fr->callno > 0)
ast_mutex_lock(&iaxsl[fr->callno]); ast_mutex_lock(&iaxsl[fr->callno]);

Loading…
Cancel
Save