From fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 03:14:29 +0200 Subject: Merging upstream version 125.0.1. Signed-off-by: Daniel Baumann --- netwerk/dns/PlatformDNSUnix.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'netwerk/dns/PlatformDNSUnix.cpp') diff --git a/netwerk/dns/PlatformDNSUnix.cpp b/netwerk/dns/PlatformDNSUnix.cpp index dedbe337df..c7f57fcdda 100644 --- a/netwerk/dns/PlatformDNSUnix.cpp +++ b/netwerk/dns/PlatformDNSUnix.cpp @@ -9,6 +9,7 @@ #include "nsIDNSService.h" #include "mozilla/Maybe.h" #include "mozilla/StaticPrefs_network.h" +#include "mozilla/ThreadLocal.h" #include #include @@ -18,6 +19,10 @@ namespace mozilla::net { +#if defined(HAVE_RES_NINIT) +MOZ_THREAD_LOCAL(struct __res_state*) sThreadRes; +#endif + #define LOG(msg, ...) \ MOZ_LOG(gGetAddrInfoLog, LogLevel::Debug, ("[DNS]: " msg, ##__VA_ARGS__)) @@ -33,16 +38,28 @@ nsresult ResolveHTTPSRecordImpl(const nsACString& aHost, uint16_t aFlags, return NS_ERROR_UNKNOWN_HOST; } +#if defined(HAVE_RES_NINIT) + if (!sThreadRes.get()) { + UniquePtr resState(new struct __res_state); + memset(resState.get(), 0, sizeof(struct __res_state)); + if (int ret = res_ninit(resState.get())) { + LOG("res_ninit failed: %d", ret); + return NS_ERROR_UNKNOWN_HOST; + } + sThreadRes.set(resState.release()); + } +#endif + LOG("resolving %s\n", host.get()); // Perform the query rv = packet.FillBuffer( [&](unsigned char response[DNSPacket::MAX_SIZE]) -> int { int len = 0; -#if defined(XP_LINUX) - len = res_nquery(&_res, host.get(), ns_c_in, +#if defined(HAVE_RES_NINIT) + len = res_nquery(sThreadRes.get(), host.get(), ns_c_in, nsIDNSService::RESOLVE_TYPE_HTTPSSVC, response, DNSPacket::MAX_SIZE); -#elif defined(XP_MACOSX) +#else len = res_query(host.get(), ns_c_in, nsIDNSService::RESOLVE_TYPE_HTTPSSVC, response, DNSPacket::MAX_SIZE); @@ -60,4 +77,16 @@ nsresult ResolveHTTPSRecordImpl(const nsACString& aHost, uint16_t aFlags, return ParseHTTPSRecord(host, packet, aResult, aTTL); } +void DNSThreadShutdown() { +#if defined(HAVE_RES_NINIT) + auto* res = sThreadRes.get(); + if (!res) { + return; + } + + sThreadRes.set(nullptr); + res_nclose(res); +#endif +} + } // namespace mozilla::net -- cgit v1.2.3