From 3d6395aa11b2a19d178d7b1c675f0bf50eaf637b Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Sun, 24 Oct 2021 18:53:49 +0200 Subject: [PATCH] Reset existing config before loading it again Closes #226 --- .../DNS/config/AndroidResolverConfigProvider.java | 1 + .../xbill/DNS/config/BaseResolverConfigProvider.java | 11 +++++++++-- .../config/JndiContextResolverConfigProvider.java | 1 + .../DNS/config/PropertyResolverConfigProvider.java | 1 + .../DNS/config/ResolvConfResolverConfigProvider.java | 1 + .../DNS/config/SunJvmResolverConfigProvider.java | 1 + .../DNS/config/WindowsResolverConfigProvider.java | 3 ++- src/test/java/org/xbill/DNS/ResolverConfigTest.java | 12 +++++++++--- 8 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/xbill/DNS/config/AndroidResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/AndroidResolverConfigProvider.java index 85c97f4c2..8266e88b1 100644 --- a/src/main/java/org/xbill/DNS/config/AndroidResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/AndroidResolverConfigProvider.java @@ -31,6 +31,7 @@ public static void setContext(Context ctx) { @Override public void initialize() throws InitializationException { + reset(); if (context == null) { throw new InitializationException("Context must be initialized by calling setContext"); } diff --git a/src/main/java/org/xbill/DNS/config/BaseResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/BaseResolverConfigProvider.java index fb99a3d59..b6e3cef12 100644 --- a/src/main/java/org/xbill/DNS/config/BaseResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/BaseResolverConfigProvider.java @@ -24,8 +24,15 @@ public abstract class BaseResolverConfigProvider implements ResolverConfigProvid private static final boolean ipv6first = Boolean.getBoolean("java.net.preferIPv6Addresses"); private final List nameservers = new ArrayList<>(3); - final Logger log = LoggerFactory.getLogger(getClass()); - List searchlist = new ArrayList<>(1); + + protected final Logger log = LoggerFactory.getLogger(getClass()); + protected final List searchlist = new ArrayList<>(1); + + protected final void reset() { + // TODO v4: make a final void initialize() that clears and then calls abstract doInit() + nameservers.clear(); + searchlist.clear(); + } protected void parseSearchPathList(String search, String delimiter) { if (search != null) { diff --git a/src/main/java/org/xbill/DNS/config/JndiContextResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/JndiContextResolverConfigProvider.java index f4769a397..b352b11d7 100644 --- a/src/main/java/org/xbill/DNS/config/JndiContextResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/JndiContextResolverConfigProvider.java @@ -43,6 +43,7 @@ private static final class InnerJndiContextResolverConfigProvider @Override public void initialize() { + reset(); Hashtable env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); // http://mail.openjdk.java.net/pipermail/net-dev/2017-March/010695.html diff --git a/src/main/java/org/xbill/DNS/config/PropertyResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/PropertyResolverConfigProvider.java index ab33a6ba8..23b9fb4f6 100644 --- a/src/main/java/org/xbill/DNS/config/PropertyResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/PropertyResolverConfigProvider.java @@ -34,6 +34,7 @@ public void initialize() { * @since 3.2 */ protected void initialize(String serverName, String searchName, String ndotsName) { + reset(); String servers = System.getProperty(serverName); if (servers != null) { StringTokenizer st = new StringTokenizer(servers, ","); diff --git a/src/main/java/org/xbill/DNS/config/ResolvConfResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/ResolvConfResolverConfigProvider.java index f0a5e49f7..0540b9b8a 100644 --- a/src/main/java/org/xbill/DNS/config/ResolvConfResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/ResolvConfResolverConfigProvider.java @@ -17,6 +17,7 @@ public class ResolvConfResolverConfigProvider extends BaseResolverConfigProvider @Override public void initialize() { + reset(); // first try the default unix config path if (!tryParseResolveConf("/etc/resolv.conf")) { // then fallback to netware diff --git a/src/main/java/org/xbill/DNS/config/SunJvmResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/SunJvmResolverConfigProvider.java index ec4c48b11..2c610ceab 100644 --- a/src/main/java/org/xbill/DNS/config/SunJvmResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/SunJvmResolverConfigProvider.java @@ -20,6 +20,7 @@ public class SunJvmResolverConfigProvider extends BaseResolverConfigProvider { @Override public void initialize() throws InitializationException { + reset(); try { Class resConfClass = Class.forName("sun.net.dns.ResolverConfiguration"); Method open = resConfClass.getDeclaredMethod("open"); diff --git a/src/main/java/org/xbill/DNS/config/WindowsResolverConfigProvider.java b/src/main/java/org/xbill/DNS/config/WindowsResolverConfigProvider.java index f0ec6c143..7e756400c 100644 --- a/src/main/java/org/xbill/DNS/config/WindowsResolverConfigProvider.java +++ b/src/main/java/org/xbill/DNS/config/WindowsResolverConfigProvider.java @@ -57,9 +57,10 @@ private static final class InnerWindowsResolverConfigProvider extends BaseResolv @Override public void initialize() throws InitializationException { + reset(); // The recommended method of calling the GetAdaptersAddresses function is to pre-allocate a // 15KB working buffer - Memory buffer = new Memory(15 * 1024); + Memory buffer = new Memory(15 * 1024L); IntByReference size = new IntByReference(0); int flags = GAA_FLAG_SKIP_UNICAST diff --git a/src/test/java/org/xbill/DNS/ResolverConfigTest.java b/src/test/java/org/xbill/DNS/ResolverConfigTest.java index d885cc7b6..834b3fa5a 100644 --- a/src/test/java/org/xbill/DNS/ResolverConfigTest.java +++ b/src/test/java/org/xbill/DNS/ResolverConfigTest.java @@ -41,12 +41,13 @@ void testSkipInit() throws Exception { @Test void properties() { - String[] dnsServers = {"192.168.1.1", "192.168.1.2", "192.168.1.1"}; + String[] dnsServers1 = {"192.168.1.1", "192.168.1.2", "192.168.1.1"}; + String[] dnsServers2 = {"192.168.1.3"}; // intentionally adding duplicate search entries for testing String[] dnsSearch = {"dnsjava.org", "example.com", "dnsjava.org"}; Name[] searchPath = Arrays.stream(dnsSearch).map(s -> Name.fromConstantString(s + ".")).toArray(Name[]::new); - System.setProperty(DNS_SERVER_PROP, String.join(",", dnsServers)); + System.setProperty(DNS_SERVER_PROP, String.join(",", dnsServers1)); System.setProperty(DNS_SEARCH_PROP, String.join(",", dnsSearch)); System.setProperty(DNS_NDOTS_PROP, String.valueOf(5)); try { @@ -55,7 +56,12 @@ void properties() { rc.initialize(); assertEquals(2, rc.servers().size()); - assertEquals(dnsServers[0], rc.servers().get(0).getAddress().getHostAddress()); + assertEquals(dnsServers1[0], rc.servers().get(0).getAddress().getHostAddress()); + + // must remove no longer present servers + System.setProperty(DNS_SERVER_PROP, String.join(",", dnsServers2)); + rc.initialize(); + assertEquals(1, rc.servers().size()); // any duplicate suffixes should be excluded assertEquals(2, rc.searchPaths().size());