From f3c6da32d79b1053ca4667191fa7a660a457b44e Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 15 Jan 2018 14:17:52 +0100 Subject: [PATCH] Fix concurrency issue in DnsNameResolver when DefaultDnsCache is used. Motivation: We need to ensure we only call List.* methods in the synchronized block as the returned List may not be thread-safe. Modifications: Do not call isEmpty() outside of the synchronized block. Result: Fixes [#7583] --- .../java/io/netty/resolver/dns/DnsNameResolver.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java b/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java index 8510488c68..1a928f8c23 100644 --- a/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java +++ b/resolver-dns/src/main/java/io/netty/resolver/dns/DnsNameResolver.java @@ -600,7 +600,7 @@ public class DnsNameResolver extends InetNameResolver { Promise promise, DnsCache resolveCache) { final List cachedEntries = resolveCache.get(hostname, additionals); - if (cachedEntries == null || cachedEntries.isEmpty()) { + if (cachedEntries == null) { return false; } @@ -608,7 +608,9 @@ public class DnsNameResolver extends InetNameResolver { Throwable cause = null; synchronized (cachedEntries) { final int numEntries = cachedEntries.size(); - assert numEntries > 0; + if (numEntries == 0) { + return false; + } if (cachedEntries.get(0).cause() != null) { cause = cachedEntries.get(0).cause(); @@ -730,7 +732,7 @@ public class DnsNameResolver extends InetNameResolver { Promise> promise, DnsCache resolveCache) { final List cachedEntries = resolveCache.get(hostname, additionals); - if (cachedEntries == null || cachedEntries.isEmpty()) { + if (cachedEntries == null) { return false; } @@ -738,7 +740,9 @@ public class DnsNameResolver extends InetNameResolver { Throwable cause = null; synchronized (cachedEntries) { final int numEntries = cachedEntries.size(); - assert numEntries > 0; + if (numEntries == 0) { + return false; + } if (cachedEntries.get(0).cause() != null) { cause = cachedEntries.get(0).cause();