]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 317283 via svnmerge from
authorJonathan Rose <jrose@digium.com>
Thu, 5 May 2011 19:33:11 +0000 (19:33 +0000)
committerJonathan Rose <jrose@digium.com>
Thu, 5 May 2011 19:33:11 +0000 (19:33 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r317283 | jrose | 2011-05-05 14:09:13 -0500 (Thu, 05 May 2011) | 10 lines

  Resolves a deadlock that occurs during sip_new

  This is based on an uncommitted patch by jpeeler for the issue.  Instead of
  relocking and then unlocking the channel though, we keep the lock on the channel
  until we are finished doing what we need to the channel.

  (closes issue #18441)
  Reported by: Alric
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@317334 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 6d532760f0d514e6e5d1b0d6a98463b351100313..2ab88b37bacfb7016cc0f4fd371feb49abe759e9 100644 (file)
@@ -6722,7 +6722,6 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
        sip_pvt_lock(i);
        ast_channel_cc_params_init(tmp, i->cc_params);
        tmp->caller.id.tag = ast_strdup(i->cid_tag);
-       ast_channel_unlock(tmp);
 
        tmp->tech = ( ast_test_flag(&i->flags[0], SIP_DTMF) == SIP_DTMF_INFO || ast_test_flag(&i->flags[0], SIP_DTMF) == SIP_DTMF_SHORTINFO) ?  &sip_tech_info : &sip_tech;
 
@@ -6888,6 +6887,8 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
                pbx_builtin_setvar_helper(tmp, v->name, ast_get_encoded_str(v->value, valuebuf, sizeof(valuebuf)));
        }
 
+       ast_channel_unlock(tmp); /* ast_hangup requires the channel to be unlocked */
+
        if (state != AST_STATE_DOWN && ast_pbx_start(tmp)) {
                ast_log(LOG_WARNING, "Unable to start PBX on %s\n", tmp->name);
                tmp->hangupcause = AST_CAUSE_SWITCH_CONGESTION;