From 21ad428d0d8735cda1d0930b38a6719824929af7 Mon Sep 17 00:00:00 2001
From: Matthew Nicholson <mnicholson@digium.com>
Date: Thu, 18 Jun 2009 17:41:09 +0000
Subject: [PATCH] Added deadlock protection to try_suggested_sip_codec in
 chan_sip.c.

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 | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 6795ce2eee..97168e7ee4 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -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);
-- 
GitLab