[asterisk-commits] rmudgett: branch 10 r364845 - in /branches/10: ./ channels/chan_local.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue May 1 16:50:36 CDT 2012
Author: rmudgett
Date: Tue May 1 16:50:32 2012
New Revision: 364845
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=364845
Log:
* Fix error path resouce leak in local_request().
* Restructure local_request() to reduce indentation.
........
Merged revisions 364840 from http://svn.asterisk.org/svn/asterisk/branches/1.8
Modified:
branches/10/ (props changed)
branches/10/channels/chan_local.c
Propchange: branches/10/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: branches/10/channels/chan_local.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/channels/chan_local.c?view=diff&rev=364845&r1=364844&r2=364845
==============================================================================
--- branches/10/channels/chan_local.c (original)
+++ branches/10/channels/chan_local.c Tue May 1 16:50:32 2012
@@ -1166,20 +1166,26 @@
/*! \brief Part of PBX interface */
static struct ast_channel *local_request(const char *type, struct ast_format_cap *cap, const struct ast_channel *requestor, void *data, int *cause)
{
- struct local_pvt *p = NULL;
- struct ast_channel *chan = NULL;
+ struct local_pvt *p;
+ struct ast_channel *chan;
/* Allocate a new private structure and then Asterisk channel */
- if ((p = local_alloc(data, cap))) {
- if (!(chan = local_new(p, AST_STATE_DOWN, requestor ? requestor->linkedid : NULL))) {
- ao2_unlink(locals, p);
- }
- if (chan && ast_channel_cc_params_init(chan, requestor ? ast_channel_get_cc_config_params((struct ast_channel *)requestor) : NULL)) {
- chan = ast_channel_release(chan);
- ao2_unlink(locals, p);
- }
- ao2_ref(p, -1); /* kill the ref from the alloc */
- }
+ p = local_alloc(data, cap);
+ if (!p) {
+ return NULL;
+ }
+ chan = local_new(p, AST_STATE_DOWN, requestor ? requestor->linkedid : NULL);
+ if (!chan) {
+ ao2_unlink(locals, p);
+ } else if (ast_channel_cc_params_init(chan, requestor ? ast_channel_get_cc_config_params((struct ast_channel *)requestor) : NULL)) {
+ ao2_unlink(locals, p);
+ p->owner = ast_channel_release(p->owner);
+ ast_module_user_remove(p->u_owner);
+ p->chan = ast_channel_release(p->chan);
+ ast_module_user_remove(p->u_chan);
+ chan = NULL;
+ }
+ ao2_ref(p, -1); /* kill the ref from the alloc */
return chan;
}
More information about the asterisk-commits
mailing list