1 /* 2 * Copyright (c) 2014, Red Hat, Inc. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @summary DNS resource record parsing 27 */ 28 29 import com.sun.jndi.dns.ResourceRecord; 30 import javax.naming.InvalidNameException; 31 32 import java.lang.reflect.Constructor; 33 import java.lang.reflect.InvocationTargetException; 34 import static java.nio.charset.StandardCharsets.ISO_8859_1; 35 36 public class Parser { 37 static Constructor<ResourceRecord> rrConstructor; 38 static { 39 try { 40 rrConstructor = ResourceRecord.class.getDeclaredConstructor( 41 byte[].class, int.class, int.class, boolean.class, 42 boolean.class); 43 rrConstructor.setAccessible(true); 44 } catch (Exception e) { 45 throw new AssertionError(e); 46 } 47 } 48 49 static ResourceRecord parse(String data, int offset, boolean qSection) 50 throws Throwable { 51 byte[] bytes = data.getBytes(ISO_8859_1); 52 try { 53 return rrConstructor.newInstance( 54 bytes, bytes.length, offset, qSection, !qSection); 55 } catch (InvocationTargetException e) { 56 throw e.getCause(); 57 } 58 } 59 60 public static void main(String[] args) throws Throwable { 61 ResourceRecord rr; 62 63 rr = parse("\003www\007example\003com\000\000\002\000\001", 64 0, true); 65 if (!rr.getName().toString().equals("www.example.com.")) { 66 throw new AssertionError(rr.getName().toString()); 67 } 68 if (rr.getRrclass() != 1) { 69 throw new AssertionError("RCLASS: " + rr.getRrclass()); 70 } 71 if (rr.getType() != 2) { 72 throw new AssertionError("RTYPE: " + rr.getType()); 73 } 74 75 rr = parse("1-2-3-4-5-6-" + 76 "\003www\007example\003com\000\000\002\000\001" + 77 "\300\014\000\002\000\001\000\001\121\200" + 78 "\000\005\002ns\300\020", 79 33, false); 80 if (!rr.getName().toString().equals("www.example.com.")) { 81 throw new AssertionError(rr.getName().toString()); 82 } 83 if (rr.getRrclass() != 1) { 84 throw new AssertionError("RCLASS: " + rr.getRrclass()); 85 } 86 if (rr.getType() != 2) { 87 throw new AssertionError("RTYPE: " + rr.getType()); 88 } 89 if (!rr.getRdata().toString().equals("ns.example.com.")) { 90 throw new AssertionError("RDATA: " + rr.getRdata()); 91 } 92 93 try { 94 parse("1-2-3-4-5-6-" + 95 "\003www\007example\003com\000\000\002\000\001" + 96 "\300\014\000\002\000\001\300\051\300\047" + 97 "\000\005\002ns\300\051", 98 33, false); 99 throw new AssertionError(); 100 } catch (InvalidNameException e) { 101 if (!e.getMessage().equals("Too many compression references")) { 102 throw e; 103 } 104 } 105 } 106 }