]> 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:50:32 +0000 (21:50 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 1 May 2012 21:50:32 +0000 (21:50 +0000)
* Restructure local_request() to reduce indentation.
........

Merged revisions 364840 from http://svn.asterisk.org/svn/asterisk/branches/1.8

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

channels/chan_local.c

index 937ede4c229d893a7a57703d5e69173742dfa454..47668e357d7a1e91b82d2786b574db73d4255879 100644 (file)
@@ -1166,20 +1166,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, 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;
 }