Fix some bugs related to originating calls. If the code failed to start a PBX

on the channel (such as if you set a call limit based on the system's load
average), then there were cases where a channel that has already been free'd
using ast_hangup() got accessed.  This caused weird memory corruption and
crashes to occur.

(fixes issue BE-386)
(much debugging credit goes to twilson, final patch written by me)


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@107158 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2008-03-10 20:04:27 +00:00
parent 7a47679898
commit 0a4fc5b8c6

View File

@@ -5016,6 +5016,7 @@ int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout
if (channel)
*channel = NULL;
ast_hangup(chan);
chan = NULL;
res = -1;
}
} else {
@@ -5026,6 +5027,7 @@ int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout
ast_channel_unlock(chan);
}
ast_hangup(chan);
chan = NULL;
res = -1;
}
}
@@ -5045,6 +5047,7 @@ int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout
ast_channel_unlock(chan);
}
ast_hangup(chan);
chan = NULL;
}
}
@@ -5072,7 +5075,11 @@ int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout
pbx_builtin_setvar_helper(chan, "REASON", failed_reason);
if (account)
ast_cdr_setaccount(chan, account);
ast_pbx_run(chan);
if (ast_pbx_run(chan)) {
ast_log(LOG_ERROR, "Unable to run PBX on %s\n", chan->name);
ast_hangup(chan);
}
chan = NULL;
}
}
}