8164730: Make it clear that 'cl' parameter passed to RMIConnector.OISWL is never null.
authorvtewari
Tue, 06 Sep 2016 13:57:03 +0530
changeset 40742 3697a4ff4721
parent 40741 e05878664d94
child 40743 a775e4de954f
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
jdk/src/java.management/share/classes/javax/management/remote/rmi/RMIConnector.java
jdk/test/javax/management/remote/mandatory/connection/ObjectInputStreamWithLoaderNullCheckTest.java
--- 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);
+       }
+    }
+}