From b343b499b55421e9b808c875bfdb82c0fba28009 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Thu, 5 Jan 2017 09:29:31 +0100 Subject: [PATCH] MiniDNS resolver: Fix exception when there is only a A or AAAA RR W/System.err: java.lang.IllegalStateException: Can not perform operation because the DNS resolution was unsuccessful W/System.err: at de.measite.minidns.hla.ResolverResult.throwIseIfErrorResponse(ResolverResult.ja va:113) W/System.err: at de.measite.minidns.hla.ResolverResult.getAnswers(ResolverResult.java:56) W/System.err: at org.jivesoftware.smack.util.dns.minidns.MiniDnsResolver.lookupHostAddress0(Mini DnsResolver.java:130) W/System.err: at org.jivesoftware.smack.util.dns.DNSResolver.lookupHostAddress(DNSResolver.java: 52) W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.populateHostAddresses(AbstractXMP PConnection.java:612) W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectUsingConfiguration(XMPPTCPC onnection.java:555) W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection. java:885) W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.ja va:374) W/System.err: at com.example.bosleo.chatapp.ChatConnection.connect(ChatConnection.java:147) W/System.err: at com.example.bosleo.chatapp.ChatConnectionService.initConnection(ChatConnectionS ervice.java:82) W/System.err: at com.example.bosleo.chatapp.ChatConnectionService.access$100(ChatConnectionServi ce.java:20) W/System.err: at com.example.bosleo.chatapp.ChatConnectionService$1.run(ChatConnectionService.ja va:105) W/System.err: at java.lang.Thread.run(Thread.java:818) W/System.err: Caused by: de.measite.minidns.hla.ResolutionUnsuccessfulException: Asking for 192.168.2.128. IN AAAA yielded an error response NX_DOMAIN W/System.err: at de.measite.minidns.hla.ResolverResult.getResolutionUnsuccessfulException(Resolv erResult.java:89) W/System.err: at de.measite.minidns.hla.ResolverResult.throwIseIfErrorResponse(ResolverResult.ja va:111) W/System.err: ... 12 more --- .../util/dns/minidns/MiniDnsResolver.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/smack-resolver-minidns/src/main/java/org/jivesoftware/smack/util/dns/minidns/MiniDnsResolver.java b/smack-resolver-minidns/src/main/java/org/jivesoftware/smack/util/dns/minidns/MiniDnsResolver.java index b62bdcb71..ff5906ff7 100644 --- a/smack-resolver-minidns/src/main/java/org/jivesoftware/smack/util/dns/minidns/MiniDnsResolver.java +++ b/smack-resolver-minidns/src/main/java/org/jivesoftware/smack/util/dns/minidns/MiniDnsResolver.java @@ -20,8 +20,10 @@ import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Set; import org.jivesoftware.smack.ConnectionConfiguration.DnssecMode; import org.jivesoftware.smack.initializer.SmackInitializer; @@ -126,10 +128,28 @@ public class MiniDnsResolver extends DNSResolver implements SmackInitializer { return null; } - List inetAddresses = new ArrayList<>(aResult.getAnswers().size() - + aaaaResult.getAnswers().size()); + // TODO: Use ResolverResult.getAnswersOrEmptySet() once we updated MiniDNS. + Set aResults; + if (aResult.wasSuccessful()) { + aResults = aResult.getAnswers(); + } + else { + aResults = Collections.emptySet(); + } - for (A a : aResult.getAnswers()) { + // TODO: Use ResolverResult.getAnswersOrEmptySet() once we updated MiniDNS. + Set aaaaResults; + if (aaaaResult.wasSuccessful()) { + aaaaResults = aaaaResult.getAnswers(); + } + else { + aaaaResults = Collections.emptySet(); + } + + List inetAddresses = new ArrayList<>(aResults.size() + + aaaaResults.size()); + + for (A a : aResults) { InetAddress inetAddress; try { inetAddress = InetAddress.getByAddress(a.getIp()); @@ -139,7 +159,7 @@ public class MiniDnsResolver extends DNSResolver implements SmackInitializer { } inetAddresses.add(inetAddress); } - for (AAAA aaaa : aaaaResult.getAnswers()) { + for (AAAA aaaa : aaaaResults) { InetAddress inetAddress; try { inetAddress = InetAddress.getByAddress(name, aaaa.getIp());