]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Backport fix for issue #16774 to 1.6.0 (refcount leak with provisional responses)
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 11 May 2010 19:35:37 +0000 (19:35 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 11 May 2010 19:35:37 +0000 (19:35 +0000)
(closes issue #16202)
 Reported by: jsutton
 Patches:
       20100504__issue16202.diff.txt uploaded by tilghman (license 14)
 Tested by: tilghman

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

channels/chan_sip.c

index 1f16d6b099e5630bdd1f73cd2397931e6445c312..54be4895ea1e32dbf5fc9a15b3d9340babf2c975 100644 (file)
@@ -3345,10 +3345,13 @@ static int send_provisional_keepalive_with_sdp(const void *data) {
 
 static void update_provisional_keepalive(struct sip_pvt *pvt, int with_sdp)
 {
-       AST_SCHED_DEL(sched, pvt->provisional_keepalive_sched_id);
+       AST_SCHED_DEL_UNREF(sched, pvt->provisional_keepalive_sched_id, dialog_unref(pvt));
 
        pvt->provisional_keepalive_sched_id = ast_sched_add(sched, PROVIS_KEEPALIVE_TIMEOUT,
                with_sdp ? send_provisional_keepalive_with_sdp : send_provisional_keepalive, pvt);
+       if (pvt->provisional_keepalive_sched_id > 0) {
+               dialog_ref(pvt);
+       }
 }
 
 /*! \brief Transmit response on SIP request*/
@@ -3374,7 +3377,7 @@ static int send_response(struct sip_pvt *p, struct sip_request *req, enum xmitty
 
        /* If we are sending a final response to an INVITE, stop retransmitting provisional responses */
        if (p->initreq.method == SIP_INVITE && reliable == XMIT_CRITICAL) {
-               AST_SCHED_DEL(sched, p->provisional_keepalive_sched_id);
+               AST_SCHED_DEL_UNREF(sched, p->provisional_keepalive_sched_id, dialog_unref(p));
        }
 
        res = (reliable) ?
@@ -4690,7 +4693,7 @@ static int __sip_destroy(struct sip_pvt *p, int lockowner)
        AST_SCHED_DEL(sched, p->waitid);
        AST_SCHED_DEL(sched, p->autokillid);
        AST_SCHED_DEL(sched, p->request_queue_sched_id);
-       AST_SCHED_DEL(sched, p->provisional_keepalive_sched_id);
+       AST_SCHED_DEL_UNREF(sched, p->provisional_keepalive_sched_id, dialog_unref(p));
        AST_SCHED_DEL(sched, p->t38id);
 
        if (p->rtp) {