diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-22 16:57:38 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-22 16:57:38 +0000 |
commit | 66939684b362fe089efabc6ab9aa0eb028a5bed8 (patch) | |
tree | 1c0346c77037d0de7c362dd1b66db664f37dcb91 /channels | |
parent | a632aee1694dd04080ce51add2519c10a8ff18bd (diff) |
Prevent a deadlock in chan_iax2 resulting from
incorrect locking order between iax2_pvt and
ast_channel structures.
AST-13
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@139456 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_iax2.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 2f5ba90d5..a269d634a 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -7851,11 +7851,14 @@ retryowner: pbx_builtin_setvar_helper(bridged_chan, "BLINDTRANSFER", iaxs[fr->callno]->owner->name); if (!strcmp(ies.called_number, ast_parking_ext())) { - if (iax_park(bridged_chan, iaxs[fr->callno]->owner)) { + struct ast_channel *saved_channel = iaxs[fr->callno]->owner; + ast_mutex_unlock(iaxsl[fr->callno]); + if (iax_park(bridged_chan, saved_channel)) { ast_log(LOG_WARNING, "Failed to park call on '%s'\n", bridged_chan->name); } else { ast_log(LOG_DEBUG, "Parked call on '%s'\n", bridged_chan->name); } + ast_mutex_lock(iaxsl[fr->callno]); } else { if (ast_async_goto(bridged_chan, iaxs[fr->callno]->context, ies.called_number, 1)) ast_log(LOG_WARNING, "Async goto of '%s' to '%s@%s' failed\n", bridged_chan->name, |