# HG changeset patch # User igerasim # Date 1429651498 -10800 # Node ID d04853b8a545eb80332ccffcfa30dfc45ca2ae16 # Parent 800a35ef53653f34a706a3f11d9f6000c7d05964 8075378: JNDI DnsClient Exception Handling Reviewed-by: vinnie diff -r 800a35ef5365 -r d04853b8a545 src/share/classes/com/sun/jndi/dns/DnsClient.java --- a/src/share/classes/com/sun/jndi/dns/DnsClient.java Mon Jul 06 15:53:08 2015 +0100 +++ b/src/share/classes/com/sun/jndi/dns/DnsClient.java Wed Apr 22 00:24:58 2015 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -187,119 +187,124 @@ Exception caughtException = null; boolean[] doNotRetry = new boolean[servers.length]; - // - // The UDP retry strategy is to try the 1st server, and then - // each server in order. If no answer, double the timeout - // and try each server again. - // - for (int retry = 0; retry < retries; retry++) { + try { + // + // The UDP retry strategy is to try the 1st server, and then + // each server in order. If no answer, double the timeout + // and try each server again. + // + for (int retry = 0; retry < retries; retry++) { - // Try each name server. - for (int i = 0; i < servers.length; i++) { - if (doNotRetry[i]) { - continue; - } - - // send the request packet and wait for a response. - try { - if (debug) { - dprint("SEND ID (" + (retry + 1) + "): " + xid); + // Try each name server. + for (int i = 0; i < servers.length; i++) { + if (doNotRetry[i]) { + continue; } - byte[] msg = null; - msg = doUdpQuery(pkt, servers[i], serverPorts[i], - retry, xid); - // - // If the matching response is not got within the - // given timeout, check if the response was enqueued - // by some other thread, if not proceed with the next - // server or retry. - // - if (msg == null) { - if (resps.size() > 0) { - msg = lookupResponse(xid); - } - if (msg == null) { // try next server or retry - continue; + // send the request packet and wait for a response. + try { + if (debug) { + dprint("SEND ID (" + (retry + 1) + "): " + xid); } - } - Header hdr = new Header(msg, msg.length); - if (auth && !hdr.authoritative) { - caughtException = new NameNotFoundException( - "DNS response not authoritative"); - doNotRetry[i] = true; - continue; - } - if (hdr.truncated) { // message is truncated -- try TCP - - // Try each server, starting with the one that just - // provided the truncated message. - for (int j = 0; j < servers.length; j++) { - int ij = (i + j) % servers.length; - if (doNotRetry[ij]) { + byte[] msg = null; + msg = doUdpQuery(pkt, servers[i], serverPorts[i], + retry, xid); + // + // If the matching response is not got within the + // given timeout, check if the response was enqueued + // by some other thread, if not proceed with the next + // server or retry. + // + if (msg == null) { + if (resps.size() > 0) { + msg = lookupResponse(xid); + } + if (msg == null) { // try next server or retry continue; } - try { - Tcp tcp = - new Tcp(servers[ij], serverPorts[ij]); - byte[] msg2; + } + Header hdr = new Header(msg, msg.length); + + if (auth && !hdr.authoritative) { + caughtException = new NameNotFoundException( + "DNS response not authoritative"); + doNotRetry[i] = true; + continue; + } + if (hdr.truncated) { // message is truncated -- try TCP + + // Try each server, starting with the one that just + // provided the truncated message. + for (int j = 0; j < servers.length; j++) { + int ij = (i + j) % servers.length; + if (doNotRetry[ij]) { + continue; + } try { - msg2 = doTcpQuery(tcp, pkt); - } finally { - tcp.close(); - } - Header hdr2 = new Header(msg2, msg2.length); - if (hdr2.query) { - throw new CommunicationException( - "DNS error: expecting response"); - } - checkResponseCode(hdr2); + Tcp tcp = + new Tcp(servers[ij], serverPorts[ij]); + byte[] msg2; + try { + msg2 = doTcpQuery(tcp, pkt); + } finally { + tcp.close(); + } + Header hdr2 = new Header(msg2, msg2.length); + if (hdr2.query) { + throw new CommunicationException( + "DNS error: expecting response"); + } + checkResponseCode(hdr2); - if (!auth || hdr2.authoritative) { - // Got a valid response - hdr = hdr2; - msg = msg2; - break; - } else { - doNotRetry[ij] = true; + if (!auth || hdr2.authoritative) { + // Got a valid response + hdr = hdr2; + msg = msg2; + break; + } else { + doNotRetry[ij] = true; + } + } catch (Exception e) { + // Try next server, or use UDP response } - } catch (Exception e) { - // Try next server, or use UDP response - } - } // servers - } - return new ResourceRecords(msg, msg.length, hdr, false); + } // servers + } + return new ResourceRecords(msg, msg.length, hdr, false); - } catch (IOException e) { - if (debug) { - dprint("Caught IOException:" + e); - } - if (caughtException == null) { - caughtException = e; - } - // Use reflection to allow pre-1.4 compilation. - // This won't be needed much longer. - if (e.getClass().getName().equals( - "java.net.PortUnreachableException")) { + } catch (IOException e) { + if (debug) { + dprint("Caught IOException:" + e); + } + if (caughtException == null) { + caughtException = e; + } + // Use reflection to allow pre-1.4 compilation. + // This won't be needed much longer. + if (e.getClass().getName().equals( + "java.net.PortUnreachableException")) { + doNotRetry[i] = true; + } + } catch (NameNotFoundException e) { + // This is authoritative, so return immediately + throw e; + } catch (CommunicationException e) { + if (caughtException == null) { + caughtException = e; + } + } catch (NamingException e) { + if (caughtException == null) { + caughtException = e; + } doNotRetry[i] = true; } - } catch (NameNotFoundException e) { - throw e; - } catch (CommunicationException e) { - if (caughtException == null) { - caughtException = e; - } - } catch (NamingException e) { - if (caughtException == null) { - caughtException = e; - } - doNotRetry[i] = true; - } - } // servers - } // retries + } // servers + } // retries - reqs.remove(xid); + } finally { + reqs.remove(xid); // cleanup + } + if (caughtException instanceof NamingException) { throw (NamingException) caughtException; }