8163258: Getting NullPointerException from ImageIO.getReaderWriterInfo due to failure to check for null
Reviewed-by: prr, psadhukhan
--- a/jdk/src/java.desktop/share/classes/javax/imageio/ImageIO.java Thu Aug 18 10:46:48 2016 +0530
+++ b/jdk/src/java.desktop/share/classes/javax/imageio/ImageIO.java Fri Aug 19 12:22:23 2016 +0530
@@ -462,10 +462,13 @@
return new String[0];
}
- HashSet<String> s = new HashSet<String>();
+ HashSet<String> s = new HashSet<>();
while (iter.hasNext()) {
ImageReaderWriterSpi spi = iter.next();
- Collections.addAll(s, spiInfo.info(spi));
+ String[] info = spiInfo.info(spi);
+ if (info != null) {
+ Collections.addAll(s, info);
+ }
}
return s.toArray(new String[s.size()]);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/imageio/GetReaderWriterInfoNullTest.java Fri Aug 19 12:22:23 2016 +0530
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2016, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8163258
+ * @summary Test verifies that when we create our own ImageReaderSpi
+ * implementaion with MIMEType or FileSuffix as null, it should
+ * not throw NullPointerException when we call
+ * ImageIO.getReaderMIMETypes() or ImageIO.getReaderFileSuffixes().
+ * @run main GetReaderWriterInfoNullTest
+ */
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Locale;
+import javax.imageio.IIOException;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.spi.ImageReaderSpi;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.ImageIO;
+import javax.imageio.spi.IIORegistry;
+
+class TestImageReaderSpi extends ImageReaderSpi {
+
+ public TestImageReaderSpi(String[] FORMATNAMES, String[] SUFFIXES,
+ String[] MIMETYPES) {
+ super("J Duke", // vendor
+ "1.0", // version
+ FORMATNAMES, // format names
+ SUFFIXES, // file suffixes
+ MIMETYPES, // mimetypes
+ "readTest.TestImageReader", // reader class name
+ new Class<?>[] { ImageInputStream.class }, // input types
+ null, // writer class names.
+ true, // supports native metadata,
+ null, // [no] native stream metadata format
+ null, // [no] native stream metadata class
+ null, // [no] native extra stream metadata format
+ null, // [no] native extra stream metadata class
+ true, // supports standard metadata,
+ null, // metadata format name,
+ null, // metadata format class name
+ null, // [no] extra image metadata format
+ null // [no] extra image metadata format class
+ );
+ }
+
+ @Override
+ public boolean canDecodeInput(Object source) throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public String getDescription(Locale locale) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public ImageReader createReaderInstance(Object extension)
+ throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+}
+
+class TestImageReader extends ImageReader {
+
+ public TestImageReader(ImageReaderSpi originatingProvider) {
+ super(originatingProvider);
+ }
+
+ @Override
+ public int getNumImages(boolean allowSearch) throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int getWidth(int imageIndex) throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int getHeight(int imageIndex) throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Iterator<ImageTypeSpecifier> getImageTypes(int imageIndex)
+ throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public IIOMetadata getStreamMetadata() throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public IIOMetadata getImageMetadata(int imageIndex) throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public BufferedImage read(int imageIndex, ImageReadParam param)
+ throws IOException {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
+public class GetReaderWriterInfoNullTest {
+ static final String[] FORMATNAMES = {"readTest"};
+ static final String[] SUFFIXES = {"readTest"};
+ static final String[] MIMETYPES = {"readTest"};
+ public static void main (String[] args) throws IIOException {
+ // Verify getReaderMIMETypes() behavior by keeping MIMEType as null.
+ TestImageReaderSpi mimeNullReadSpi =
+ new TestImageReaderSpi(FORMATNAMES, SUFFIXES, null);
+ IIORegistry.getDefaultInstance().
+ registerServiceProvider(mimeNullReadSpi);
+ ImageIO.getReaderMIMETypes();
+ IIORegistry.getDefaultInstance().
+ deregisterServiceProvider(mimeNullReadSpi);
+
+ /*
+ * Verify getReaderFileSuffixes() behavior by keeping
+ * file suffix as null.
+ */
+ TestImageReaderSpi suffixNullReadSpi =
+ new TestImageReaderSpi(FORMATNAMES, null, MIMETYPES);
+ IIORegistry.getDefaultInstance().
+ registerServiceProvider(suffixNullReadSpi);
+ ImageIO.getReaderFileSuffixes();
+ IIORegistry.getDefaultInstance().
+ deregisterServiceProvider(suffixNullReadSpi);
+ }
+}
+