From 94743edaf7f7a75125aba0c026806ae550f07756 Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Sat, 18 Jul 2015 00:22:45 +0200 Subject: [PATCH] Bug 1183781 - Fix leak in nsHostResolver r=sworkman --- netwerk/dns/nsHostResolver.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/netwerk/dns/nsHostResolver.cpp b/netwerk/dns/nsHostResolver.cpp index a343100bbbc9..44ffbdf4d0ac 100644 --- a/netwerk/dns/nsHostResolver.cpp +++ b/netwerk/dns/nsHostResolver.cpp @@ -471,6 +471,15 @@ HostDB_ClearEntry(PLDHashTable *table, } } #endif + + { + MutexAutoLock lock(he->rec->addr_info_lock); + if (he->rec->addr_info) { + delete hr->addr_info; + he->rec->addr_info = nullptr; + } + } + NS_RELEASE(he->rec); } @@ -853,8 +862,12 @@ nsHostResolver::ResolveHost(const char *host, LOG((" Trying AF_UNSPEC entry for host [%s%s%s] af: %s.\n", LOG_HOST(host, netInterface), (af == PR_AF_INET) ? "AF_INET" : "AF_INET6")); - - he->rec->addr_info = nullptr; + // Ensure existing `addr_info` in `he` is cleared before + // copying from `unSpecHe`. + if (he->rec->addr_info) { + delete he->rec->addr_info; + he->rec->addr_info = nullptr; + } if (unspecHe->rec->negative) { he->rec->negative = unspecHe->rec->negative; he->rec->CopyExpirationTimesAndFlagsFrom(unspecHe->rec);