Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 291355) +++ channels/chan_sip.c (working copy) @@ -8602,9 +8602,17 @@ static int sip_poke_peer_s(const void *data) { struct sip_peer *peer = (struct sip_peer *) data; + struct sip_peer *foundpeer; peer->pokeexpire = -1; + foundpeer = ASTOBJ_CONTAINER_FIND(&peerl, peer->name); + if (!foundpeer || foundpeer->name != peer->name) { + ASTOBJ_UNREF(foundpeer, sip_destroy_peer); + return 0; + } + + ASTOBJ_UNREF(foundpeer, sip_destroy_peer); sip_poke_peer(peer); ASTOBJ_UNREF(peer, sip_destroy_peer); @@ -19741,6 +19749,18 @@ { reload_config(reason); + /* before peers are removed from the peer container, cancel any scheduled pokes */ + ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do { + ASTOBJ_RDLOCK(iterator); + if (ast_test_flag(&iterator->flags[0], SIP_REALTIME)) { + if (!AST_SCHED_DEL(sched, iterator->pokeexpire)) { + struct sip_peer *peer_ptr = iterator; + ASTOBJ_UNREF(peer_ptr, sip_destroy_peer); + } + } + ASTOBJ_UNLOCK(iterator); + } while (0) ); + /* Prune peers who still are supposed to be deleted */ ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, sip_destroy_peer); if (option_debug > 3)