From f561146fa7d610ccf71d5783a19016dd9765f4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Andr=C3=A9n?= Date: Wed, 20 Oct 2021 08:03:12 +0200 Subject: [PATCH] Do not try to resolve localhost with search domains (#30779) * Prepopulate cache with localhost entries --- .../dns/AsyncDnsResolverIntegrationSpec.scala | 2 -- .../io/dns/internal/AsyncDnsResolver.scala | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/io/dns/AsyncDnsResolverIntegrationSpec.scala b/akka-actor-tests/src/test/scala/akka/io/dns/AsyncDnsResolverIntegrationSpec.scala index 7d92076cd4..f990cc0137 100644 --- a/akka-actor-tests/src/test/scala/akka/io/dns/AsyncDnsResolverIntegrationSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/io/dns/AsyncDnsResolverIntegrationSpec.scala @@ -183,8 +183,6 @@ class AsyncDnsResolverIntegrationSpec } "resolve localhost even though ndots is greater than 0" in { - // This currently works because the nameserver resolves localhost, but in future should work because we've - // implemented proper support for /etc/hosts val name = "localhost" val answer = resolve(name, DnsProtocol.Ip(ipv6 = false)) withClue(answer) { diff --git a/akka-actor/src/main/scala/akka/io/dns/internal/AsyncDnsResolver.scala b/akka-actor/src/main/scala/akka/io/dns/internal/AsyncDnsResolver.scala index 081166b380..8d1c4644e5 100644 --- a/akka-actor/src/main/scala/akka/io/dns/internal/AsyncDnsResolver.scala +++ b/akka-actor/src/main/scala/akka/io/dns/internal/AsyncDnsResolver.scala @@ -39,6 +39,29 @@ private[io] final class AsyncDnsResolver( implicit val ec: ExecutionContextExecutor = context.dispatcher + // avoid ever looking up localhost by pre-populating cache + { + val loopback = InetAddress.getLoopbackAddress + val (ipv4Address, ipv6Address) = loopback match { + case ipv6: Inet6Address => (InetAddress.getByName("127.0.0.1"), ipv6) + case ipv4: Inet4Address => (ipv4, InetAddress.getByName("::1")) + case unknown => throw new IllegalArgumentException(s"Loopback address was [$unknown]") + } + cache.put( + "localhost" -> Ip(), + DnsProtocol.Resolved("localhost", ARecord("localhost", Ttl.effectivelyForever, loopback) :: Nil), + Ttl.effectivelyForever) + cache.put( + "localhost" -> Ip(ipv6 = false, ipv4 = true), + DnsProtocol.Resolved("localhost", ARecord("localhost", Ttl.effectivelyForever, ipv4Address) :: Nil), + Ttl.effectivelyForever) + cache.put( + "localhost" -> Ip(ipv6 = true, ipv4 = false), + DnsProtocol.Resolved("localhost", ARecord("localhost", Ttl.effectivelyForever, ipv6Address) :: Nil), + Ttl.effectivelyForever) + + } + // For ask to DNS Client implicit val timeout: Timeout = Timeout(settings.ResolveTimeout)