summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorDavid Vossel <dvossel@digium.com>2010-08-09 20:49:13 +0000
committerDavid Vossel <dvossel@digium.com>2010-08-09 20:49:13 +0000
commit62ab85a834369da62d7c7948153f2b753b22c27f (patch)
tree269e11dae88d13e2a2fcaf45d7a35e1165cd6bfe /channels
parent416b05e9daf0a81a6d22b4458b2a9ff2f55d5886 (diff)
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
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index bba34fb4e..350dc5306 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;