diff options
author | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-06-19 21:07:53 +0000 |
---|---|---|
committer | mnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-06-19 21:07:53 +0000 |
commit | 18b6e5dca655f886a075a270f5c627444e755078 (patch) | |
tree | 4c61489274dedd56a1bcdb3fa2a70416017d04c7 | |
parent | fe640f651992ae2a640506b216bdf3ebb701148d (diff) |
Added deadlock protection to try_suggested_sip_codec in chan_sip.c.
Review: https://reviewboard.asterisk.org/r/287/
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@202006 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | channels/chan_sip.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index ef7b9b244..c2e608977 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -5112,8 +5112,20 @@ static void try_suggested_sip_codec(struct sip_pvt *p) int fmt; const char *codec; - codec = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC"); - if (!codec) + while (p->owner && ast_channel_trylock(p->owner)) { + sip_pvt_unlock(p); + sched_yield(); + sip_pvt_lock(p); + } + + if (!p->owner) + return; + + codec = ast_strdupa(S_OR(pbx_builtin_getvar_helper(p->owner, "SIP_CODEC"), "")); + + ast_channel_unlock(p->owner); + + if (ast_strlen_zero(codec)) return; fmt = ast_getformatbyname(codec); |