]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
* Fix error path resouce leak in local_request().
authorRichard Mudgett <rmudgett@digium.com>
Tue, 1 May 2012 21:36:54 +0000 (21:36 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 1 May 2012 21:36:54 +0000 (21:36 +0000)
* Restructure local_request() to reduce indentation.

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

channels/chan_local.c

index 2d85cb923da9a4be8536c8eb5833dd34df4bbbd4..a783949afc6a7c443e4e358a5860aec4eca3b63b 100644 (file)
@@ -1159,20 +1159,26 @@ static struct ast_channel *local_new(struct local_pvt *p, int state, const char
 /*! \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;
+       struct local_pvt *p;
+       struct ast_channel *chan;
 
-       /* 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 */
+       /* 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;
 }