aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-11-11 21:58:25 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-11-11 21:58:25 +0000
commit3a12700a4b360439842f07ad80a5ff5b31042ed6 (patch)
tree7e6b00db106c828b1aa59c25543d1a44efbf6536 /channels
parentffa2bb0c7eef8448fb628d36b0fdc67509ec70bf (diff)
Merged revisions 294733 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r294733 | jpeeler | 2010-11-11 15:57:22 -0600 (Thu, 11 Nov 2010) | 25 lines Merged revisions 294688 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r294688 | jpeeler | 2010-11-11 15:12:27 -0600 (Thu, 11 Nov 2010) | 18 lines Fix problem with qualify option packets for realtime peers never stopping. The option packets not only never stopped, but if a realtime peer was not in the peer list multiple options dialogs could accumulate over time. This scenario has the potential to progress to the point of saturating a link just from options packets. The fix was to ensure that the poke scheduler checks to see if a peer is in the peer list before continuing to poke. The reason a peer must be in the peer list to be able to properly manage an options dialog is because otherwise the call pointer is lost when the peer is regenerated from the database, which is how existing qualify dialogs are detected. (closes issue #16382) (closes issue #17779) Reported by: lftsy Patches: bug16382-3.patch uploaded by jpeeler (license 325) Tested by: zerohalo ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@294734 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 55a6ed19c..774d70181 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -2627,6 +2627,9 @@ cleanup:
static int peer_is_marked(void *peerobj, void *arg, int flags)
{
struct sip_peer *peer = peerobj;
+ if (peer->the_mark && peer->pokeexpire != -1) {
+ AST_SCHED_DEL(sched, peer->pokeexpire);
+ }
return peer->the_mark ? CMP_MATCH : 0;
}
@@ -12779,11 +12782,22 @@ static int expire_register(const void *data)
static int sip_poke_peer_s(const void *data)
{
struct sip_peer *peer = (struct sip_peer *)data;
+ struct sip_peer *foundpeer;
peer->pokeexpire = -1;
- sip_poke_peer(peer, 0);
+ foundpeer = ao2_find(peers, peer, OBJ_POINTER);
+ if (!foundpeer) {
+ unref_peer(peer, "removing poke peer ref");
+ return 0;
+ } else if (foundpeer->name != peer->name) {
+ unref_peer(foundpeer, "removing above peer ref");
+ unref_peer(peer, "removing poke peer ref");
+ return 0;
+ }
+ unref_peer(foundpeer, "removing above peer ref");
+ sip_poke_peer(peer, 0);
unref_peer(peer, "removing poke peer ref");
return 0;