From 4c4dd505be30de996659f9d3496fc88956fcfbf6 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 18 May 2012 12:21:46 -0400 Subject: [PATCH] Fix a hard-to-trigger memory leak in launch_resolve To hit this leak, you need to be a relay that gets a RESOLVE request or an exit node getting a BEGIN or RESOLVE request. You must either have unconfigured (and unconfigurable) nameservers, or you must have somehow set DisableNetwork after a network request arrived but before you managed to process it. So, I doubt this is reached often. Still, a leak's a leak. Fix for bug 5916; bugfix on 0.2.3.9-alpha and 0.1.2.1-alpha. --- changes/bug5916 | 6 ++++++ src/or/dns.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 changes/bug5916 diff --git a/changes/bug5916 b/changes/bug5916 new file mode 100644 index 0000000000..0b2ea5df44 --- /dev/null +++ b/changes/bug5916 @@ -0,0 +1,6 @@ + o Minor bugfixes: + - Fix a memory leak when trying to launch a DNS request when the + network is disabled or the nameservers are unconfigurable. Fix + for bug 5916; bugfix on Tor 0.1.2.1-alpha (for the + unconfigurable namesrever case) and on 0.2.3.9-alpha (for the + DisableNetwork case). diff --git a/src/or/dns.c b/src/or/dns.c index 2b7d3e3506..b349f02f68 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -1389,7 +1389,7 @@ evdns_callback(int result, char type, int count, int ttl, void *addresses, static int launch_resolve(edge_connection_t *exitconn) { - char *addr = tor_strdup(exitconn->_base.address); + char *addr; struct evdns_request *req = NULL; tor_addr_t a; int r; @@ -1408,6 +1408,8 @@ launch_resolve(edge_connection_t *exitconn) } } + addr = tor_strdup(exitconn->_base.address); + r = tor_addr_parse_PTR_name( &a, exitconn->_base.address, AF_UNSPEC, 0);