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