From 285d953fdf78e104e3914da01caf81d6bd992cda Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Thu, 3 Feb 2011 23:50:08 +0000 Subject: Merged revisions 306215 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r306215 | jpeeler | 2011-02-03 17:49:28 -0600 (Thu, 03 Feb 2011) | 20 lines Fix SIP deadlock involving state changes. Once again a call to pbx_builtin_getvar_helper (and pbx_builtin_setvar_helper) has caused locking problems. Both of these functions lock the channel when the channel argument is passed in! In this case, the suspected problem (the backtrace makes it impossible to tell) was the private being locked in sip_set_rtp_peer and then: transmit_reinvite_with_sdp try_suggested_sip_codec pbx_builtin_getvar_helper (Traced to verify that the fix was only required in 1.8 and later.) (closes issue #18491) Reported by: cmaj Patches: chan_sip_fix_deadlocks_bug_18491.txt uploaded by cmaj (license 830) Tested by: cmaj ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@306216 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'channels') diff --git a/channels/chan_sip.c b/channels/chan_sip.c index e80f387cc..d9304b66e 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -28052,10 +28052,12 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *i return 0; } + ast_channel_lock(chan); sip_pvt_lock(p); if (p->alreadygone) { /* If we're destroyed, don't bother */ sip_pvt_unlock(p); + ast_channel_unlock(chan); return 0; } @@ -28064,6 +28066,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *i */ if (nat_active && !ast_test_flag(&p->flags[0], SIP_DIRECT_MEDIA_NAT)) { sip_pvt_unlock(p); + ast_channel_unlock(chan); return 0; } @@ -28106,6 +28109,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *i /* Reset lastrtprx timer */ p->lastrtprx = p->lastrtptx = time(NULL); sip_pvt_unlock(p); + ast_channel_unlock(chan); return 0; } -- cgit v1.2.3