diff --git a/make/mapfiles/libjava/mapfile-vers b/make/mapfiles/libjava/mapfile-vers index 0d3e9e059c731169fb7d78cd755a79e4373eab4f..09b25bfb0d58cd9742c06f2793b97758eb87be27 100644 --- a/make/mapfiles/libjava/mapfile-vers +++ b/make/mapfiles/libjava/mapfile-vers @@ -278,7 +278,7 @@ SUNWprivate_1.1 { Java_sun_misc_Version_getJvmVersionInfo; Java_sun_misc_Version_getJvmSpecialVersion; Java_sun_misc_VM_getThreadStateValues; - Java_sun_misc_VM_latestUserDefinedLoader; + Java_sun_misc_VM_latestUserDefinedLoader0; Java_sun_misc_VM_initialize; Java_sun_misc_VMSupport_initAgentProperties; Java_sun_misc_VMSupport_getVMTemporaryDirectory; diff --git a/src/share/classes/java/io/ObjectInputStream.java b/src/share/classes/java/io/ObjectInputStream.java index de9c6366d689b4b31f7f1ac3e1ba37bf3e0f55d1..fa1832ddcea96652f9abe52abaf17cb9684726a9 100644 --- a/src/share/classes/java/io/ObjectInputStream.java +++ b/src/share/classes/java/io/ObjectInputStream.java @@ -2329,10 +2329,11 @@ public class ObjectInputStream int ndoubles); /** - * Returns the first non-null class loader (not counting class loaders of - * generated reflection implementation classes) up the execution stack, or - * null if only code from the null class loader is on the stack. This - * method is also called via reflection by the following RMI-IIOP class: + * Returns first non-privileged class loader on the stack (excluding + * reflection generated frames) or the extension class loader if only + * class loaded by the boot class loader and extension class loader are + * found on the stack. This method is also called via reflection by the + * following RMI-IIOP class: * * com.sun.corba.se.internal.util.JDKClassLoader * diff --git a/src/share/classes/sun/misc/Launcher.java b/src/share/classes/sun/misc/Launcher.java index 37bc190de4eaff1c0a5b12e3f7ca008f57112405..a5d4b7270fe7fa80f789ede862177defcb826cbb 100644 --- a/src/share/classes/sun/misc/Launcher.java +++ b/src/share/classes/sun/misc/Launcher.java @@ -128,8 +128,6 @@ public class Launcher { */ public static ExtClassLoader getExtClassLoader() throws IOException { - final File[] dirs = getExtDirs(); - try { // Prior implementations of this doPrivileged() block supplied // aa synthesized ACC via a call to the private method @@ -138,6 +136,7 @@ public class Launcher { return AccessController.doPrivileged( new PrivilegedExceptionAction() { public ExtClassLoader run() throws IOException { + final File[] dirs = getExtDirs(); int len = dirs.length; for (int i = 0; i < len; i++) { MetaIndex.registerDirectory(dirs[i]); diff --git a/src/share/classes/sun/misc/VM.java b/src/share/classes/sun/misc/VM.java index 4ae2664b7c1e175a76b73fe769f523dfc6696966..3e64628c6fbd0e5ecc94d12b08f29ba22c84c3b9 100644 --- a/src/share/classes/sun/misc/VM.java +++ b/src/share/classes/sun/misc/VM.java @@ -26,6 +26,8 @@ package sun.misc; import static java.lang.Thread.State.*; +import java.io.IOException; +import java.security.AccessControlException; import java.util.Properties; import java.util.HashMap; import java.util.Map; @@ -399,10 +401,23 @@ public class VM { private final static int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020; /* - * Returns the first non-null class loader up the execution stack, - * or null if only code from the null class loader is on the stack. + * Returns first non-privileged class loader on the stack (excluding + * reflection generated frames) or the extension class loader if only + * class loaded by the boot class loader and extension class loader are + * found on the stack. */ - public static native ClassLoader latestUserDefinedLoader(); + public static native ClassLoader latestUserDefinedLoader0(); + public static ClassLoader latestUserDefinedLoader() { + ClassLoader loader = latestUserDefinedLoader0(); + if (loader != null) { + return loader; + } + try { + return Launcher.ExtClassLoader.getExtClassLoader(); + } catch (IOException e) { + return null; + } + } static { initialize(); diff --git a/src/share/classes/sun/rmi/server/MarshalInputStream.java b/src/share/classes/sun/rmi/server/MarshalInputStream.java index 838ac3279dbdbec197f5544c031563c0f963830b..91be64bc441ba6d1bdc833de57c5ac30a6eb3145 100644 --- a/src/share/classes/sun/rmi/server/MarshalInputStream.java +++ b/src/share/classes/sun/rmi/server/MarshalInputStream.java @@ -255,8 +255,10 @@ public class MarshalInputStream extends ObjectInputStream { } /* - * Returns the first non-null class loader up the execution stack, or null - * if only code from the null class loader is on the stack. + * Returns first non-privileged class loader on the stack (excluding + * reflection generated frames) or the extension class loader if only + * class loaded by the boot class loader and extension class loader are + * found on the stack. */ private static ClassLoader latestUserDefinedLoader() { return sun.misc.VM.latestUserDefinedLoader(); diff --git a/src/share/native/sun/misc/VM.c b/src/share/native/sun/misc/VM.c index f7b752f3f2d06dd6be85c3aff70af0512509735b..573ad4f6f2e6feb97288b6498c0e80d1c82d8716 100644 --- a/src/share/native/sun/misc/VM.c +++ b/src/share/native/sun/misc/VM.c @@ -112,7 +112,7 @@ Java_sun_misc_VM_getThreadStateValues(JNIEnv *env, jclass cls, } JNIEXPORT jobject JNICALL -Java_sun_misc_VM_latestUserDefinedLoader(JNIEnv *env, jclass cls) { +Java_sun_misc_VM_latestUserDefinedLoader0(JNIEnv *env, jclass cls) { return JVM_LatestUserDefinedLoader(env); }