Fix case where local is allocated but not actually called on
authorMark Spencer <markster@digium.com>
Mon, 19 May 2003 23:37:38 +0000 (23:37 +0000)
committerMark Spencer <markster@digium.com>
Mon, 19 May 2003 23:37:38 +0000 (23:37 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1043 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_local.c

index 56c3c64..4c4d4e1 100755 (executable)
@@ -230,12 +230,14 @@ static int local_hangup(struct ast_channel *ast)
        int isoutbound = IS_OUTBOUND(ast, p);
        struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
        struct local_pvt *cur, *prev=NULL;
        int isoutbound = IS_OUTBOUND(ast, p);
        struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP };
        struct local_pvt *cur, *prev=NULL;
+       struct ast_channel *ochan = NULL;
        ast_pthread_mutex_lock(&p->lock);
        if (isoutbound)
                p->chan = NULL;
        else
                p->owner = NULL;
        ast->pvt->pvt = NULL;
        ast_pthread_mutex_lock(&p->lock);
        if (isoutbound)
                p->chan = NULL;
        else
                p->owner = NULL;
        ast->pvt->pvt = NULL;
+       
        if (!p->owner && !p->chan) {
                /* Okay, done with the private part now, too. */
                ast_pthread_mutex_unlock(&p->lock);
        if (!p->owner && !p->chan) {
                /* Okay, done with the private part now, too. */
                ast_pthread_mutex_unlock(&p->lock);
@@ -258,8 +260,14 @@ static int local_hangup(struct ast_channel *ast)
                free(p);
                return 0;
        }
                free(p);
                return 0;
        }
-       local_queue_frame(p, isoutbound, &f);
+       if (p->chan && !p->chan->pbx)
+               /* Need to actually hangup since there is no PBX */
+               ochan = p->chan;
+       else
+               local_queue_frame(p, isoutbound, &f);
        ast_pthread_mutex_unlock(&p->lock);
        ast_pthread_mutex_unlock(&p->lock);
+       if (ochan)
+               ast_hangup(ochan);
        return 0;
 }
 
        return 0;
 }