From 9dbd385de78f5aed201c8ae1fcd45002094dc9c7 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Mon, 24 Dec 2007 16:17:01 +0000 Subject: [PATCH] More deadlock avoidance code (this time between sip_monitor and sip_hangup) Reported by: apsaras Patch by: tilghman (Closes issue #11413) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@94765 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 4cdf354955..c33c747b4c 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -15497,7 +15497,14 @@ restartsearch: get back to this point every millisecond or less) */ for (sip = iflist; !fastrestart && sip; sip = sip->next) { - ast_mutex_lock(&sip->lock); + /*! \note If we can't get a lock on an interface, skip it and come + * back later. Note that there is the possibility of a deadlock with + * sip_hangup otherwise, because sip_hangup is called with the channel + * locked first, and the iface lock is attempted second. + */ + if (ast_mutex_trylock(&sip->lock)) + continue; + /* Check RTP timeouts and kill calls if we have a timeout set and do not get RTP */ if (sip->rtp && sip->owner && (sip->owner->_state == AST_STATE_UP) &&