From 62ab85a834369da62d7c7948153f2b753b22c27f Mon Sep 17 00:00:00 2001
From: David Vossel <dvossel@digium.com>
Date: Mon, 9 Aug 2010 20:49:13 +0000
Subject: [PATCH] Merged revisions 281432 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.8

................
  r281432 | dvossel | 2010-08-09 15:47:53 -0500 (Mon, 09 Aug 2010) | 20 lines

  Merged revisions 281430 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.6.2

  ........
    r281430 | dvossel | 2010-08-09 15:46:50 -0500 (Mon, 09 Aug 2010) | 13 lines

    fixes SIP peers memory leak

    We zeroed out the peer's addr before it was removed from the
    peers_by_ip container.  This made it impossible to be removed
    from the container as the addr is the key used by the container
    to find the peer.

    (closes issue #17774)
    Reported by: kkm
    Patches:
          017774-sip-peer-leak-1.6.2.10.diff uploaded by kkm (license 888)
          017774-sip-peer-leak-1.8.diff uploaded by kkm (license 888)
  ........
................


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@281433 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_sip.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index bba34fb4e3..350dc53069 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -12655,7 +12655,6 @@ static int expire_register(const void *data)
 
 	peer->expire = -1;
 	peer->portinuri = 0;
-	memset(&peer->addr, 0, sizeof(peer->addr));
 
 	destroy_association(peer);	/* remove registration data from storage */
 	set_socket_transport(&peer->socket, peer->default_outbound_transport);
@@ -12684,6 +12683,10 @@ static int expire_register(const void *data)
 		}
 	}
 
+	/* Only clear the addr after we check for destruction.  The addr must remain
+	 * in order to unlink from the peers_by_ip container correctly */
+	memset(&peer->addr, 0, sizeof(peer->addr));
+
 	unref_peer(peer, "removing peer ref for expire_register");
 
 	return 0;
-- 
GitLab