diff options
author | Russell Bryant <russell@russellbryant.com> | 2007-08-17 13:39:17 +0000 |
---|---|---|
committer | Russell Bryant <russell@russellbryant.com> | 2007-08-17 13:39:17 +0000 |
commit | 9d54c1427806e8282473b9849297b24aa157822f (patch) | |
tree | a92a2bb6d45028b01fa4478bfab8d53e07667a02 /channels/chan_sip.c | |
parent | 7ee8772e2d1d1c42167c557ce8f1632c31c28bdc (diff) |
Merged revisions 79857 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r79857 | russell | 2007-08-17 08:37:08 -0500 (Fri, 17 Aug 2007) | 5 lines
Fix some crashes in chan_sip. This patch changes various places that add items
to the scheduler to ensure that they don't overwrite the ID of a previously
scheduled item. If there is one, it should be removed.
(closes issue #10391, closes issue #10256, probably others, patch by me)
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@79858 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r-- | channels/chan_sip.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 4df005db1..53c80e947 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2373,6 +2373,8 @@ static enum sip_result __sip_reliable_xmit(struct sip_pvt *p, int seqno, int res siptimer_a = pkt->timer_t1 * 2; /* Schedule retransmission */ + if (pkt->retransid > -1) + ast_sched_del(sched, pkt->retransid); pkt->retransid = ast_sched_add_variable(sched, siptimer_a, retrans_pkt, pkt, 1); if (sipdebug) ast_debug(4, "*** SIP TIMER: Initalizing retransmit timer on packet: Id #%d\n", pkt->retransid); @@ -3561,6 +3563,8 @@ static int sip_call(struct ast_channel *ast, char *dest, int timeout) p->invitestate = INV_CALLING; /* Initialize auto-congest time */ + if (p->initid > -1) + ast_sched_del(sched, p->initid); p->initid = ast_sched_add(sched, SIP_TRANS_TIMEOUT, auto_congest, dialog_ref(p)); } @@ -13439,7 +13443,9 @@ static int handle_response_register(struct sip_pvt *p, int resp, char *rest, str r->refresh= (int) expires_ms / 1000; /* Schedule re-registration before we expire */ - r->expire=ast_sched_add(sched, expires_ms, sip_reregister, r); + if (r->expire > -1) + ast_sched_del(sched, r->expire); + r->expire = ast_sched_add(sched, expires_ms, sip_reregister, r); registry_unref(r); } return 1; @@ -16564,6 +16570,8 @@ static int sip_poke_noanswer(void *data) peer->lastms = -1; ast_device_state_changed("SIP/%s", peer->name); /* Try again quickly */ + if (peer->pokeexpire > -1) + ast_sched_del(sched, peer->pokeexpire); peer->pokeexpire = ast_sched_add(sched, DEFAULT_FREQ_NOTOK, sip_poke_peer_s, peer); return 0; } @@ -16626,8 +16634,11 @@ static int sip_poke_peer(struct sip_peer *peer) peer->ps = ast_tvnow(); if (xmitres == XMIT_ERROR) sip_poke_noanswer(peer); /* Immediately unreachable, network problems */ - else + else { + if (peer->pokeexpire > -1) + ast_sched_del(sched, peer->pokeexpire); peer->pokeexpire = ast_sched_add(sched, DEFAULT_MAXMS * 2, sip_poke_noanswer, peer); + } return 0; } |