From: Olle Johansson Date: Tue, 14 Nov 2006 11:06:31 +0000 (+0000) Subject: Avoid collissions between the peerpoke system and the retransmits. Issue #8272. X-Git-Tag: 1.2.14~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=62cb689e89aceea82b5ec532bd225f0460063fec;p=thirdparty%2Fasterisk.git Avoid collissions between the peerpoke system and the retransmits. Issue #8272. In some cases, changed timers caused the retransmit system to destroy the dialog before peerpoke_expire got a chance. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@47596 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a461e7133b..f00f7745c4 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1246,7 +1246,9 @@ static int retrans_pkt(void *data) ast_mutex_unlock(&pkt->owner->owner->lock); } else { /* If no channel owner, destroy now */ - ast_set_flag(pkt->owner, SIP_NEEDDESTROY); + /* Let the peerpoke system expire packets when the timer expires for poke_noanswer */ + if (pkt->method != SIP_OPTIONS) + ast_set_flag(pkt->owner, SIP_NEEDDESTROY); } } /* In any case, go ahead and remove the packet */ @@ -9968,7 +9970,7 @@ static int handle_response_peerpoke(struct sip_pvt *p, int resp, char *rest, str ast_sched_del(sched, peer->pokeexpire); if (sipmethod == SIP_INVITE) /* Does this really happen? */ transmit_request(p, SIP_ACK, seqno, 0, 0); - ast_set_flag(p, SIP_NEEDDESTROY); + ast_set_flag(p, SIP_NEEDDESTROY); /* Try again eventually */ if ((peer->lastms < 0) || (peer->lastms > peer->maxms)) @@ -11691,7 +11693,7 @@ static int sip_poke_peer(struct sip_peer *peer) peer->call = NULL; return 0; } - if (peer->call > 0) { + if (peer->call) { if (sipdebug) ast_log(LOG_NOTICE, "Still have a QUALIFY dialog active, deleting\n"); sip_destroy(peer->call);