]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 294688 via svnmerge from
authorJeff Peeler <jpeeler@digium.com>
Thu, 11 Nov 2010 21:57:22 +0000 (21:57 +0000)
committerJeff Peeler <jpeeler@digium.com>
Thu, 11 Nov 2010 21:57:22 +0000 (21:57 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@294733 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index b41f0e5a8a33cf6e2e6aae49a339bcd7fbcf8167..310c0dd22506db806a019dccd68babb2a9805759 100644 (file)
@@ -3102,6 +3102,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;
 }
 
@@ -12220,11 +12223,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;