Added deadlock protection to try_suggested_sip_codec in chan_sip.c.
authorMatthew Nicholson <mnicholson@digium.com>
Thu, 18 Jun 2009 17:41:09 +0000 (17:41 +0000)
committerMatthew Nicholson <mnicholson@digium.com>
Thu, 18 Jun 2009 17:41:09 +0000 (17:41 +0000)
Review: https://reviewboard.asterisk.org/r/285/

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

channels/chan_sip.c

index 6795ce2..97168e7 100644 (file)
@@ -6076,6 +6076,14 @@ static void try_suggested_sip_codec(struct sip_pvt *p)
 {
        int fmt;
        const char *codec;
+       struct ast_channel* chan;
+
+       chan = ast_channel_ref(p->owner);
+       while (ast_channel_trylock(chan)) {
+               sip_pvt_unlock(p);
+               usleep(1);
+               sip_pvt_lock(p);
+       }
 
        if (p->outgoing_call) {
                codec = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC_OUTBOUND");
@@ -6083,7 +6091,12 @@ static void try_suggested_sip_codec(struct sip_pvt *p)
                codec = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC");
        }
 
-       if (!codec) 
+       codec = ast_strdupa(S_OR(codec, ""));
+
+       ast_channel_unlock(chan);
+       chan = ast_channel_unref(chan);
+
+       if (ast_strlen_zero(codec))
                return;
 
        fmt = ast_getformatbyname(codec);