diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index ca792c0704a1f9b404165ee46931094c8dacea55..9b9a3801aea14dce6d86e309132e3b5ecbcf5256 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -795,8 +795,9 @@ public class NetworkMonitor extends StateMachine { private void resolveStrictModeHostname() { try { // Do a blocking DNS resolution using the network-assigned nameservers. + // Do not set AI_ADDRCONFIG in ai_flags so we get all address families in advance. final InetAddress[] ips = ResolvUtil.blockingResolveAllLocally( - mNetwork, mPrivateDnsProviderHostname); + mNetwork, mPrivateDnsProviderHostname, 0 /* aiFlags */); mPrivateDnsConfig = new PrivateDnsConfig(mPrivateDnsProviderHostname, ips); } catch (UnknownHostException uhe) { mPrivateDnsConfig = null; diff --git a/services/net/java/android/net/dns/ResolvUtil.java b/services/net/java/android/net/dns/ResolvUtil.java index a2a6615e5f48b6686066c0ad1442a532f4afb474..d9d4b96f66d0cf9080dfd9c209de750b651003cc 100644 --- a/services/net/java/android/net/dns/ResolvUtil.java +++ b/services/net/java/android/net/dns/ResolvUtil.java @@ -16,6 +16,8 @@ package android.net.dns; +import static android.system.OsConstants.AI_ADDRCONFIG; + import android.net.Network; import android.net.NetworkUtils; import android.system.GaiException; @@ -41,12 +43,17 @@ public class ResolvUtil { public static InetAddress[] blockingResolveAllLocally(Network network, String name) throws UnknownHostException { + // Use AI_ADDRCONFIG by default + return blockingResolveAllLocally(network, name, AI_ADDRCONFIG); + } + + public static InetAddress[] blockingResolveAllLocally( + Network network, String name, int aiFlags) throws UnknownHostException { final StructAddrinfo hints = new StructAddrinfo(); - // Unnecessary, but expressly no AI_ADDRCONFIG. - hints.ai_flags = 0; - // Fetch all IP addresses at once to minimize re-resolution. + hints.ai_flags = aiFlags; + // Other hints identical to the default Inet6AddressImpl implementation hints.ai_family = OsConstants.AF_UNSPEC; - hints.ai_socktype = OsConstants.SOCK_DGRAM; + hints.ai_socktype = OsConstants.SOCK_STREAM; final Network networkForResolv = getNetworkWithUseLocalNameserversFlag(network);