[asterisk-commits] alecdavis: branch 11 r391063 - in /branches/11: ./ channels/chan_iax2.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Jun 10 02:32:58 CDT 2013
Author: alecdavis
Date: Mon Jun 10 02:32:51 2013
New Revision: 391063
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=391063
Log:
IAX2: fix race condition with nativebridge transfers.
1). When touching the bridgecallno, we need to lock it.
2). stop_stuff() which calls iax2_destroy_helper()
Assumes the lock on the pvt is already held, when iax2_destroy_helper() is called.
Thus we need to lock the bridgecallno pvt before we call stop_stuff(iaxs[fr->callno]->bridgecallno);
3). When evaluating the state of 'callno->transferring' of the current leg,
we can't change it to READY unless the bridgecallno is locked.
Why, if we are interrupted by the other call leg before 'transferring = TRANSFER_RELEASED',
the interrupt will find that it is READY and that the bridgecallno is also READY so Releases the legs.
(closes issue ASTERISK-21409)
Reported by: alecdavis
Tested by: alecdavis
alecdavis (license 585)
Review https://reviewboard.asterisk.org/r/2594/
........
Merged revisions 391062 from http://svn.asterisk.org/svn/asterisk/branches/1.8
Modified:
branches/11/ (props changed)
branches/11/channels/chan_iax2.c
Propchange: branches/11/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: branches/11/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/channels/chan_iax2.c?view=diff&rev=391063&r1=391062&r2=391063
==============================================================================
--- branches/11/channels/chan_iax2.c (original)
+++ branches/11/channels/chan_iax2.c Mon Jun 10 02:32:51 2013
@@ -11520,6 +11520,15 @@
}
break;
case IAX_COMMAND_TXREADY:
+ if (iaxs[fr->callno]->bridgecallno) {
+ while (ast_mutex_trylock(&iaxsl[iaxs[fr->callno]->bridgecallno])) {
+ DEADLOCK_AVOIDANCE(&iaxsl[fr->callno]);
+ }
+ if (!iaxs[fr->callno]) {
+ break;
+ }
+ }
+
if ((iaxs[fr->callno]->transferring == TRANSFER_BEGIN) ||
(iaxs[fr->callno]->transferring == TRANSFER_MBEGIN)) {
if (iaxs[fr->callno]->transferring == TRANSFER_MBEGIN)
@@ -11567,6 +11576,9 @@
}
}
+ }
+ if (iaxs[fr->callno]->bridgecallno) {
+ ast_mutex_unlock(&iaxsl[iaxs[fr->callno]->bridgecallno]);
}
break;
case IAX_COMMAND_TXREQ:
More information about the asterisk-commits
mailing list