test/jdk/javax/imageio/plugins/png/PngImproperChunkSizeTest.java
author jdv
Tue, 30 Jan 2018 11:53:00 +0530
changeset 48728 fb62f481671e
permissions -rw-r--r--
8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size Reviewed-by: serb, pnarayanan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48728
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     1
/*
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     4
 *
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     7
 * published by the Free Software Foundation.
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     8
 *
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    13
 * accompanied this code).
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    14
 *
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    18
 *
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    21
 * questions.
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    22
 */
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    23
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    24
/*
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    25
 * @test
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    26
 * @bug     8191023
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    27
 * @summary Test verifies that PNGImageReader doesn't throw any undocumented
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    28
 *          Exception when we try to create byte array of negative size because
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    29
 *          when keyword length is more than chunk size.
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    30
 * @run     main PngImproperChunkSizeTest
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    31
 */
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    32
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    33
import java.io.ByteArrayInputStream;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    34
import java.io.IOException;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    35
import java.io.InputStream;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    36
import java.util.Base64;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    37
import javax.imageio.IIOException;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    38
import javax.imageio.ImageIO;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    39
import javax.imageio.ImageReader;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    40
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    41
public class PngImproperChunkSizeTest {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    42
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    43
    private static ImageReader reader;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    44
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    45
    private static String zTXTMalformedData = "iVBORw0KGgoAAAANSUhEUgAAAAEAAA" +
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    46
            "ABCAAAAAA6fptVAAAABHpUWHRhYWFhYWFhYQAAAApJREFUGFdj+A8AAQEBAFpNb" +
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    47
            "/EAAAAASUVORK5CYIIK";
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    48
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    49
    private static String tEXTMalformedData = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAAB"
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    50
            + "CAMAAAA6fptVAAAABHRFWHRhYWFhYWFhYQAAAApJREFUGFdj+A8AAQEBAFpNb"
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    51
            + "/EAAAAASUVORK5CYIIK";
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    52
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    53
    private static String iCCPMalformedData = "iVBORw0KGgoAAAANSUhEUgAAAAEAAA" +
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    54
            "ABCAAAAAA6fptVAAAABGlDQ1BhYWFhYWFhYQAAAApJREFUGFdj+A8AAQEBAFpNb" +
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    55
            "/EAAAAASUVORK5CYIIK";
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    56
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    57
    private static ByteArrayInputStream initializeInputStream(String input) {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    58
        byte[] inputBytes = Base64.getDecoder().decode(input);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    59
        return new ByteArrayInputStream(inputBytes);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    60
    }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    61
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    62
    private static Boolean readzTXTData(InputStream input) throws IOException {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    63
        // Set input and mark ignoreMetadata = false
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    64
        reader.setInput(ImageIO.createImageInputStream(input), true, false);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    65
        try {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    66
            reader.read(0);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    67
        } catch (IIOException e) {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    68
            Throwable cause = e.getCause();
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    69
            if (cause == null ||
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    70
                !cause.getMessage().
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    71
                        equals("zTXt chunk length is not proper"))
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    72
            {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    73
                return true;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    74
            }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    75
        }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    76
        return false;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    77
    }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    78
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    79
    private static Boolean readtEXTData(InputStream input) throws IOException {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    80
        // Set input and mark ignoreMetadata = false
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    81
        reader.setInput(ImageIO.createImageInputStream(input), true, false);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    82
        try {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    83
            reader.read(0);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    84
        } catch (IIOException e) {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    85
            Throwable cause = e.getCause();
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    86
            if (cause == null ||
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    87
                !cause.getMessage().
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    88
                        equals("tEXt chunk length is not proper"))
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    89
            {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    90
                return true;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    91
            }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    92
        }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    93
        return false;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    94
    }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    95
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    96
    private static Boolean readiCCPData(InputStream input) throws IOException {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    97
        // Set input and mark ignoreMetadata = false
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    98
        reader.setInput(ImageIO.createImageInputStream(input), true, false);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
    99
        try {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   100
            reader.read(0);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   101
        } catch (IIOException e) {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   102
            Throwable cause = e.getCause();
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   103
            if (cause == null ||
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   104
                !cause.getMessage().
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   105
                        equals("iCCP chunk length is not proper"))
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   106
            {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   107
                return true;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   108
            }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   109
        }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   110
        return false;
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   111
    }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   112
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   113
    public static void main(String[] args) throws java.io.IOException {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   114
        reader = ImageIO.getImageReadersByFormatName("png").next();
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   115
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   116
        InputStream in = initializeInputStream(zTXTMalformedData);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   117
        Boolean zTXTFailed = readzTXTData(in);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   118
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   119
        in = initializeInputStream(tEXTMalformedData);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   120
        Boolean tEXTFailed = readtEXTData(in);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   121
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   122
        in = initializeInputStream(iCCPMalformedData);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   123
        Boolean iCCPFailed = readiCCPData(in);
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   124
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   125
        reader.dispose();
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   126
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   127
        if (zTXTFailed || tEXTFailed || iCCPFailed) {
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   128
            throw new RuntimeException("Test didn't throw the required" +
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   129
                    " Exception");
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   130
        }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   131
    }
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   132
}
fb62f481671e 8191023: PngReader throws NegativeArraySizeException when keyword length exceeds chunk size
jdv
parents:
diff changeset
   133