Parser.java revision 16019:7ee327a10059
150276Speter/* 250276Speter * Copyright (c) 2014, Red Hat, Inc. 397049Speter * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4178866Srafan * 5178866Srafan * This code is free software; you can redistribute it and/or modify it 662449Speter * under the terms of the GNU General Public License version 2 only, as 7184989Srafan * published by the Free Software Foundation. 862449Speter * 950276Speter * This code is distributed in the hope that it will be useful, but WITHOUT 1050276Speter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1150276Speter * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1250276Speter * version 2 for more details (a copy is included in the LICENSE file that 1350276Speter * accompanied this code). 1450276Speter * 1550276Speter * You should have received a copy of the GNU General Public License version 1650276Speter * 2 along with this work; if not, write to the Free Software Foundation, 1750276Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1850276Speter * 1950276Speter * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2050276Speter * or visit www.oracle.com if you need additional information or have any 21166124Srafan * questions. 22166124Srafan */ 2350276Speter 2450276Speter/* 2550276Speter * @test 2650276Speter * @bug 8035105 2750276Speter * @summary DNS resource record parsing 2850276Speter * @modules jdk.naming.dns/com.sun.jndi.dns 29166124Srafan * @compile --add-modules jdk.naming.dns Parser.java 3097049Speter */ 3197049Speter 3297049Speterimport com.sun.jndi.dns.ResourceRecord; 3350276Speterimport javax.naming.CommunicationException; 3450276Speterimport javax.naming.InvalidNameException;; 3550276Speter 3650276Speterimport java.lang.reflect.Constructor; 3750276Speterimport java.lang.reflect.InvocationTargetException; 3850276Speter 3976726Speterimport java.io.IOException; 4050276Speter 4162449Speterimport static java.nio.charset.StandardCharsets.ISO_8859_1; 4262449Speter 4362449Speterpublic class Parser { 4462449Speter static Constructor<ResourceRecord> rrConstructor; 4562449Speter static { 4676726Speter try { 4762449Speter rrConstructor = ResourceRecord.class.getDeclaredConstructor( 4862449Speter byte[].class, int.class, int.class, boolean.class, 4976726Speter boolean.class); 5076726Speter rrConstructor.setAccessible(true); 5176726Speter } catch (Exception e) { 5262449Speter throw new AssertionError(e); 5376726Speter } 5476726Speter } 5576726Speter 5676726Speter static ResourceRecord parse(String data, int offset, boolean qSection) 5776726Speter throws Throwable { 5876726Speter byte[] bytes = data.getBytes(ISO_8859_1); 59178866Srafan try { 60178866Srafan return rrConstructor.newInstance( 6176726Speter bytes, bytes.length, offset, qSection, !qSection); 6276726Speter } catch (InvocationTargetException e) { 6376726Speter throw e.getCause(); 6476726Speter } 6562449Speter } 6662449Speter 6762449Speter public static void main(String[] args) throws Throwable { 6862449Speter ResourceRecord rr; 6962449Speter 7076726Speter rr = parse("\003www\007example\003com\000\000\002\000\001", 7176726Speter 0, true); 72166124Srafan if (!rr.getName().toString().equals("www.example.com.")) 7376726Speter throw new AssertionError(rr.getName().toString()); 74166124Srafan if (rr.getRrclass() != 1) 7562449Speter throw new AssertionError("RCLASS: " + rr.getRrclass()); 76166124Srafan if (rr.getType() != 2) 7762449Speter throw new AssertionError("RTYPE: " + rr.getType()); 7862449Speter 7962449Speter String longLabel = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" + 8062449Speter "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 8162449Speter 8276726Speter rr = parse("\077" + longLabel + "\077" + longLabel + 8362449Speter "\077" + longLabel + "\061" + longLabel.substring(0, 49) + 8462449Speter "\007example\003com\000\000\002\000\001", 8562449Speter 0, true); 8662449Speter if (!rr.getName().toString().equals(longLabel + 8762449Speter '.' + longLabel + '.' + longLabel + 8862449Speter '.' + longLabel.substring(0, 49) + ".example.com.")) 8962449Speter throw new AssertionError(rr.getName().toString()); 9062449Speter if (rr.getRrclass() != 1) 9162449Speter throw new AssertionError("RCLASS: " + rr.getRrclass()); 9262449Speter if (rr.getType() != 2) 9362449Speter throw new AssertionError("RTYPE: " + rr.getType()); 94166124Srafan 9562449Speter rr = parse("1-2-3-4-5-6-" + 96166124Srafan "\003www\007example\003com\000\000\002\000\001" + 97166124Srafan "\300\014\000\002\000\001\000\001\121\200" + 98166124Srafan "\000\005\002ns\300\020", 99166124Srafan 33, false); 10062449Speter if (!rr.getName().toString().equals("www.example.com.")) 10176726Speter throw new AssertionError(rr.getName().toString()); 10276726Speter if (rr.getRrclass() != 1) 10376726Speter throw new AssertionError("RCLASS: " + rr.getRrclass()); 104166124Srafan if (rr.getType() != 2) 105166124Srafan throw new AssertionError("RTYPE: " + rr.getType()); 106166124Srafan if (!rr.getRdata().toString().equals("ns.example.com.")) 107166124Srafan throw new AssertionError("RDATA: " + rr.getRdata()); 108166124Srafan 109166124Srafan try { 110166124Srafan parse("1-2-3-4-5-6-" + 111166124Srafan "\003www\007example\003com\000\000\002\000\001" + 112166124Srafan "\300\014\000\002\000\001\300\051\300\047" + 113166124Srafan "\000\005\002ns\300\051", 114166124Srafan 33, false); 115166124Srafan throw new AssertionError(); 116166124Srafan } catch (CommunicationException e) { 117166124Srafan if (!e.getMessage().equals("DNS error: malformed packet") 11897049Speter || e.getCause().getClass() != IOException.class 119166124Srafan || !e.getCause().getMessage().equals( 12097049Speter "Too many compression references")) 12197049Speter throw e; 12297049Speter } 12376726Speter 12497049Speter try { 12576726Speter String longLabel62 = "\076" + longLabel.substring(1); 12676726Speter parse(longLabel62 + longLabel62 + longLabel62 + longLabel62 + 12776726Speter "\002XX\000\000\002\000\001", 0, true); 12876726Speter throw new AssertionError(); 129166124Srafan } catch (CommunicationException e) { 13076726Speter if (!e.getMessage().equals("DNS error: malformed packet") 13150276Speter || e.getCause().getClass() != InvalidNameException.class 13297049Speter || !e.getCause().getMessage().equals("Name too long")) 13350276Speter throw e; 13450276Speter } 13550276Speter try { 13650276Speter parse("\100Y" + longLabel + "\000\000\002\000\001", 0, true); 13750276Speter throw new AssertionError(); 13850276Speter } catch (CommunicationException e) { 13976726Speter if (!e.getMessage().equals("DNS error: malformed packet") 14050276Speter || e.getCause().getClass() != IOException.class 14150276Speter || !e.getCause().getMessage().equals("Invalid label type: 64")) 14250276Speter throw e; 14350276Speter } 14450276Speter } 14562449Speter} 14697049Speter