DnsNameResolverContext reuse of DnsServerAddressStream without duplicate

Motivation:
DnsServerAddressStream provides an iterator like interface but maybe expected to start at a specific point upon each new usage. If a DnsServerAddressStream is re-used in multiple independent iterations the order of iteration maybe incorrect. DnsNameResolverContext has a fallback DnsServerAddressStream reference if the cache doesn't contain a hit, but it is shared across multiple independent iterations. This may lead to undesirable DNS query order.

Modifications:
- DnsNameResolverContext#getNameServers should duplicate the default DnsServerAddressStream

Result:
Consistent iteration over the default DnsServerAddressStream in DnsNameResolverContext.
This commit is contained in:
Scott Mitchell 2018-02-01 17:24:48 -08:00 committed by Norman Maurer
parent 3f3d309a28
commit 5257ec49ec

View File

@ -750,7 +750,7 @@ abstract class DnsNameResolverContext<T> {
private DnsServerAddressStream getNameServers(String hostname) {
DnsServerAddressStream stream = getNameServersFromCache(hostname);
return stream == null ? nameServerAddrs : stream;
return stream == null ? nameServerAddrs.duplicate() : stream;
}
private void followCname(String cname, final DnsQueryLifecycleObserver queryLifecycleObserver, Promise<T> promise) {