*************** *** 3345,3354 **** static void update_provisional_keepalive(struct sip_pvt *pvt, int with_sdp) { - AST_SCHED_DEL(sched, pvt->provisional_keepalive_sched_id); pvt->provisional_keepalive_sched_id = ast_sched_add(sched, PROVIS_KEEPALIVE_TIMEOUT, with_sdp ? send_provisional_keepalive_with_sdp : send_provisional_keepalive, pvt); } /*! \brief Transmit response on SIP request*/ --- 3345,3357 ---- static void update_provisional_keepalive(struct sip_pvt *pvt, int with_sdp) { + 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,3380 **** /* 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); } res = (reliable) ? --- 3377,3383 ---- /* 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_UNREF(sched, p->provisional_keepalive_sched_id, dialog_unref(p)); } res = (reliable) ? *************** *** 4690,4696 **** 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(sched, p->t38id); if (p->rtp) { --- 4693,4699 ---- AST_SCHED_DEL(sched, p->waitid); AST_SCHED_DEL(sched, p->autokillid); AST_SCHED_DEL(sched, p->request_queue_sched_id); + AST_SCHED_DEL_UNREF(sched, p->provisional_keepalive_sched_id, dialog_unref(p)); AST_SCHED_DEL(sched, p->t38id); if (p->rtp) {