]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Prevent a deadlock in chan_iax2 resulting from
authorMark Michelson <mmichelson@digium.com>
Fri, 22 Aug 2008 16:57:38 +0000 (16:57 +0000)
committerMark Michelson <mmichelson@digium.com>
Fri, 22 Aug 2008 16:57:38 +0000 (16:57 +0000)
incorrect locking order between iax2_pvt and
ast_channel structures.

AST-13

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

channels/chan_iax2.c

index 2f5ba90d5fee5f6e54dc702f00f349f924893418..a269d634a3c63a43704542bcd091cc8d0a75d40e 100644 (file)
@@ -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,