8164730: Make it clear that 'cl' parameter passed to RMIConnector.OISWL is never null.
Summary: Added checks inside constructor of ObjectInputStreamWithLoader inner class. Test case added.
Reviewed-by: dfuchs, alanb
Contributed-by: amit.sapre@oracle.com
--- a/jdk/src/java.management/share/classes/javax/management/remote/rmi/RMIConnector.java Mon Sep 05 10:05:12 2016 +0200
+++ b/jdk/src/java.management/share/classes/javax/management/remote/rmi/RMIConnector.java Tue Sep 06 13:57:03 2016 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -64,6 +64,7 @@
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.stream.Collectors;
@@ -1851,8 +1852,11 @@
private static final class ObjectInputStreamWithLoader
extends ObjectInputStream {
ObjectInputStreamWithLoader(InputStream in, ClassLoader cl)
- throws IOException {
+ throws IOException, IllegalArgumentException {
super(in);
+ if (cl == null ) {
+ throw new IllegalArgumentException("class loader is null");
+ }
this.loader = cl;
}
@@ -1861,7 +1865,7 @@
throws IOException, ClassNotFoundException {
String name = classDesc.getName();
ReflectUtil.checkPackageAccess(name);
- return Class.forName(name, false, loader);
+ return Class.forName(name, false, Objects.requireNonNull(loader));
}
private final ClassLoader loader;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/remote/mandatory/connection/ObjectInputStreamWithLoaderNullCheckTest.java Tue Sep 06 13:57:03 2016 +0530
@@ -0,0 +1,84 @@
+/*
+ * 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 8009560
+ * @summary Test RMIConnector.ObjectInputStreamWithLoader constructor with
+ * null Class loader. The test expects a IllegalArgumentException
+ * thrown when constructor is invoked with null class loader as
+ * an argument.
+ * @author Amit Sapre
+ * @modules java.management
+ * @run clean ObjectInputStreamWithLoaderNullCheckTest
+ * @run build ObjectInputStreamWithLoaderNullCheckTest
+ * @run main ObjectInputStreamWithLoaderNullCheckTest
+ */
+
+import java.lang.reflect.*;
+import javax.management.remote.*;
+import javax.management.remote.rmi.*;
+import java.io.*;
+
+public class ObjectInputStreamWithLoaderNullCheckTest {
+
+ private static Class<?> innerClass;
+
+ public static void main(String[] args) throws Exception {
+
+ System.out.println(">> == ObjectInputStreamWithLoaderNullCheckTest started...");
+
+ try {
+ innerClass = Class.forName("javax.management.remote.rmi.RMIConnector$ObjectInputStreamWithLoader");
+ Constructor<?> ctor = innerClass.getDeclaredConstructor(InputStream.class,ClassLoader.class);
+ ctor.setAccessible(true);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutput objOut = new ObjectOutputStream(baos);
+ objOut.writeObject(new String("Serialize"));
+ objOut.close();
+ baos.close();
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+
+ System.out.println(">> == Testing constructor with null class loader.");
+ Object obj = ctor.newInstance(bais,null);
+
+ System.out.println(">> == Test case failed. No error occured");
+ System.exit(1);
+ } catch (InvocationTargetException ex) {
+ Throwable cause = ex.getCause();
+ System.out.println(">> == InvocationTargetException Cause message : " + cause.toString());
+ if (cause instanceof IllegalArgumentException) {
+ System.out.println(">> == Test case Passed.");
+ } else {
+ System.out.println(">> == Test case Failed.");
+ ex.printStackTrace();
+ System.exit(1);
+ }
+ } catch (Exception ex) {
+ System.out.println(">>> == Test case failed with error " + ex.getCause().getMessage());
+ ex.printStackTrace();
+ System.exit(1);
+ }
+ }
+}