From 21ad428d0d8735cda1d0930b38a6719824929af7 Mon Sep 17 00:00:00 2001 From: Matthew Nicholson Date: Thu, 18 Jun 2009 17:41:09 +0000 Subject: 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(-) (limited to 'channels/chan_sip.c') diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6795ce2ee..97168e7ee 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); -- cgit v1.2.3