[asterisk-commits] dvossel: trunk r325345 - in /trunk: ./ channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jun 28 15:32:38 CDT 2011
Author: dvossel
Date: Tue Jun 28 15:32:22 2011
New Revision: 325345
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=325345
Log:
Merged revisions 325339 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
........
r325339 | dvossel | 2011-06-28 15:31:00 -0500 (Tue, 28 Jun 2011) | 4 lines
Fixes locking inversion caused by holding sip pvt lock during async_goto.
(closes ASTERISK-17352)
........
Modified:
trunk/ (props changed)
trunk/channels/chan_sip.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=325345&r1=325344&r2=325345
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Tue Jun 28 15:32:22 2011
@@ -23441,13 +23441,21 @@
}
ast_set_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER); /* Delay hangup */
-
- /* For blind transfers, move the call to the new extensions. For attended transfers on multiple
- servers - generate an INVITE with Replaces. Either way, let the dial plan decided */
- /* indicate before masquerade so the indication actually makes it to the real channel
- when using local channels with MOH passthru */
- ast_indicate(current.chan2, AST_CONTROL_UNHOLD);
- res = ast_async_goto(current.chan2, p->refer->refer_to_context, p->refer->refer_to, 1);
+ {
+ char *refer_to_context = ast_strdupa(p->refer->refer_to_context);
+ char *refer_to = ast_strdupa(p->refer->refer_to);
+
+ /* Do not hold the pvt lock during the indicate and async_goto. Those functions
+ * lock channels which will invalidate locking order if the pvt lock is held.*/
+ ao2_unlock(p);
+ /* For blind transfers, move the call to the new extensions. For attended transfers on multiple
+ * servers - generate an INVITE with Replaces. Either way, let the dial plan decided */
+ /* indicate before masquerade so the indication actually makes it to the real channel
+ *when using local channels with MOH passthru */
+ ast_indicate(current.chan2, AST_CONTROL_UNHOLD);
+ res = ast_async_goto(current.chan2, refer_to_context, refer_to, 1);
+ ao2_lock(p);
+ }
if (!res) {
ast_manager_event_multichan(EVENT_FLAG_CALL, "Transfer", 2, chans,
More information about the asterisk-commits
mailing list