[asterisk-commits] rmudgett: branch 1.8 r364840 - /branches/1.8/channels/chan_local.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue May 1 16:36:59 CDT 2012


Author: rmudgett
Date: Tue May  1 16:36:54 2012
New Revision: 364840

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=364840
Log:
* Fix error path resouce leak in local_request().

* Restructure local_request() to reduce indentation.

Modified:
    branches/1.8/channels/chan_local.c

Modified: branches/1.8/channels/chan_local.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_local.c?view=diff&rev=364840&r1=364839&r2=364840
==============================================================================
--- branches/1.8/channels/chan_local.c (original)
+++ branches/1.8/channels/chan_local.c Tue May  1 16:36:54 2012
@@ -1159,20 +1159,26 @@
 /*! \brief Part of PBX interface */
 static struct ast_channel *local_request(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause)
 {
-	struct local_pvt *p = NULL;
-	struct ast_channel *chan = NULL;
-
-	/* Allocate a new private structure and then Asterisk channel */
-	if ((p = local_alloc(data, format))) {
-		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 */
-	}
+	struct local_pvt *p;
+	struct ast_channel *chan;
+
+	/* Allocate a new private structure and then Asterisk channels */
+	p = local_alloc(data, format);
+	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