From 3577a528090aca9d574b6c408498a8ccddc2466b Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Tue, 22 Oct 2019 05:26:25 -0700 Subject: [PATCH] Ignore invalid entries in /etc/resolv.conf when parsing (#9697) Motivation: We should just ignore (and so skip) invalid entries in /etc/resolver.conf. Modifications: - Skip invalid entries - Add unit test Result: Fix https://github.com/netty/netty/issues/9684 --- ...esolverDnsServerAddressStreamProvider.java | 81 ++++++++++--------- ...verDnsServerAddressStreamProviderTest.java | 13 +++ 2 files changed, 56 insertions(+), 38 deletions(-) diff --git a/resolver-dns/src/main/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProvider.java b/resolver-dns/src/main/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProvider.java index 4f233ffa93..f2ffe537a8 100644 --- a/resolver-dns/src/main/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProvider.java +++ b/resolver-dns/src/main/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProvider.java @@ -167,48 +167,53 @@ public final class UnixResolverDnsServerAddressStreamProvider implements DnsServ String line; while ((line = br.readLine()) != null) { line = line.trim(); - char c; - if (line.isEmpty() || (c = line.charAt(0)) == '#' || c == ';') { - continue; - } - if (line.startsWith(NAMESERVER_ROW_LABEL)) { - int i = indexOfNonWhiteSpace(line, NAMESERVER_ROW_LABEL.length()); - if (i < 0) { - throw new IllegalArgumentException("error parsing label " + NAMESERVER_ROW_LABEL + - " in file " + etcResolverFile + ". value: " + line); + try { + char c; + if (line.isEmpty() || (c = line.charAt(0)) == '#' || c == ';') { + continue; } - String maybeIP = line.substring(i); - // There may be a port appended onto the IP address so we attempt to extract it. - if (!NetUtil.isValidIpV4Address(maybeIP) && !NetUtil.isValidIpV6Address(maybeIP)) { - i = maybeIP.lastIndexOf('.'); - if (i + 1 >= maybeIP.length()) { + if (line.startsWith(NAMESERVER_ROW_LABEL)) { + int i = indexOfNonWhiteSpace(line, NAMESERVER_ROW_LABEL.length()); + if (i < 0) { throw new IllegalArgumentException("error parsing label " + NAMESERVER_ROW_LABEL + - " in file " + etcResolverFile + ". invalid IP value: " + line); + " in file " + etcResolverFile + ". value: " + line); } - port = Integer.parseInt(maybeIP.substring(i + 1)); - maybeIP = maybeIP.substring(0, i); + + String maybeIP = line.substring(i); + // There may be a port appended onto the IP address so we attempt to extract it. + if (!NetUtil.isValidIpV4Address(maybeIP) && !NetUtil.isValidIpV6Address(maybeIP)) { + i = maybeIP.lastIndexOf('.'); + if (i + 1 >= maybeIP.length()) { + throw new IllegalArgumentException("error parsing label " + NAMESERVER_ROW_LABEL + + " in file " + etcResolverFile + ". invalid IP value: " + line); + } + port = Integer.parseInt(maybeIP.substring(i + 1)); + maybeIP = maybeIP.substring(0, i); + } + addresses.add(SocketUtils.socketAddress(maybeIP, port)); + } else if (line.startsWith(DOMAIN_ROW_LABEL)) { + int i = indexOfNonWhiteSpace(line, DOMAIN_ROW_LABEL.length()); + if (i < 0) { + throw new IllegalArgumentException("error parsing label " + DOMAIN_ROW_LABEL + + " in file " + etcResolverFile + " value: " + line); + } + domainName = line.substring(i); + if (!addresses.isEmpty()) { + putIfAbsent(domainToNameServerStreamMap, domainName, addresses); + } + addresses = new ArrayList<>(2); + } else if (line.startsWith(PORT_ROW_LABEL)) { + int i = indexOfNonWhiteSpace(line, PORT_ROW_LABEL.length()); + if (i < 0) { + throw new IllegalArgumentException("error parsing label " + PORT_ROW_LABEL + + " in file " + etcResolverFile + " value: " + line); + } + port = Integer.parseInt(line.substring(i)); + } else if (line.startsWith(SORTLIST_ROW_LABEL)) { + logger.info("row type {} not supported. Ignoring line: {}", SORTLIST_ROW_LABEL, line); } - addresses.add(SocketUtils.socketAddress(maybeIP, port)); - } else if (line.startsWith(DOMAIN_ROW_LABEL)) { - int i = indexOfNonWhiteSpace(line, DOMAIN_ROW_LABEL.length()); - if (i < 0) { - throw new IllegalArgumentException("error parsing label " + DOMAIN_ROW_LABEL + - " in file " + etcResolverFile + " value: " + line); - } - domainName = line.substring(i); - if (!addresses.isEmpty()) { - putIfAbsent(domainToNameServerStreamMap, domainName, addresses); - } - addresses = new ArrayList<>(2); - } else if (line.startsWith(PORT_ROW_LABEL)) { - int i = indexOfNonWhiteSpace(line, PORT_ROW_LABEL.length()); - if (i < 0) { - throw new IllegalArgumentException("error parsing label " + PORT_ROW_LABEL + - " in file " + etcResolverFile + " value: " + line); - } - port = Integer.parseInt(line.substring(i)); - } else if (line.startsWith(SORTLIST_ROW_LABEL)) { - logger.info("row type {} not supported. ignoring line: {}", SORTLIST_ROW_LABEL, line); + } catch (IllegalArgumentException e) { + logger.warn("Could not parse entry. Ignoring line: {}", line, e); } } if (!addresses.isEmpty()) { diff --git a/resolver-dns/src/test/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProviderTest.java b/resolver-dns/src/test/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProviderTest.java index 33996679e6..ce5f0c07ae 100644 --- a/resolver-dns/src/test/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProviderTest.java +++ b/resolver-dns/src/test/java/io/netty/resolver/dns/UnixResolverDnsServerAddressStreamProviderTest.java @@ -164,6 +164,19 @@ public class UnixResolverDnsServerAddressStreamProviderTest { assertEquals(Collections.singletonList("squarecorp.local"), domains); } + @Test + public void ignoreInvalidEntries() throws Exception { + File f = buildFile("domain netty.local\n" + + "nameserver nil\n" + + "nameserver 127.0.0.3\n"); + UnixResolverDnsServerAddressStreamProvider p = + new UnixResolverDnsServerAddressStreamProvider(f, null); + + DnsServerAddressStream stream = p.nameServerAddressStream("somehost"); + assertEquals(1, stream.size()); + assertHostNameEquals("127.0.0.3", stream.next()); + } + private File buildFile(String contents) throws IOException { File f = folder.newFile(); OutputStream out = new FileOutputStream(f);