6636650: (cl) Resurrected ClassLoaders can still have children
Summary: Prevent classloader from resurrection
Reviewed-by: hawtin
--- a/jdk/src/share/classes/java/lang/ClassLoader.java Thu Aug 20 12:46:43 2009 +0400
+++ b/jdk/src/share/classes/java/lang/ClassLoader.java Thu Aug 20 14:49:31 2009 -0700
@@ -186,11 +186,6 @@
parallelLoaders.add(ClassLoader.class);
}
- // If initialization succeed this is set to true and security checks will
- // succeed. Otherwise the object is not initialized and the object is
- // useless.
- private final boolean initialized;
-
// The parent class loader for delegation
// Note: VM hardcoded the offset of this field, thus all new fields
// must be added *after* it.
@@ -232,6 +227,31 @@
private final HashMap<String, Package> packages =
new HashMap<String, Package>();
+ private static Void checkCreateClassLoader() {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ security.checkCreateClassLoader();
+ }
+ return null;
+ }
+
+ private ClassLoader(Void unused, ClassLoader parent) {
+ this.parent = parent;
+ if (parallelLoaders.contains(this.getClass())) {
+ parallelLockMap = new ConcurrentHashMap<String, Object>();
+ package2certs = new ConcurrentHashMap<String, Certificate[]>();
+ domains =
+ Collections.synchronizedSet(new HashSet<ProtectionDomain>());
+ assertionLock = new Object();
+ } else {
+ // no finer-grained lock; lock on the classloader instance
+ parallelLockMap = null;
+ package2certs = new Hashtable<String, Certificate[]>();
+ domains = new HashSet<ProtectionDomain>();
+ assertionLock = this;
+ }
+ }
+
/**
* Creates a new class loader using the specified parent class loader for
* delegation.
@@ -252,25 +272,7 @@
* @since 1.2
*/
protected ClassLoader(ClassLoader parent) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkCreateClassLoader();
- }
- this.parent = parent;
- if (parallelLoaders.contains(this.getClass())) {
- parallelLockMap = new ConcurrentHashMap<String, Object>();
- package2certs = new ConcurrentHashMap<String, Certificate[]>();
- domains =
- Collections.synchronizedSet(new HashSet<ProtectionDomain>());
- assertionLock = new Object();
- } else {
- // no finer-grained lock; lock on the classloader instance
- parallelLockMap = null;
- package2certs = new Hashtable<String, Certificate[]>();
- domains = new HashSet<ProtectionDomain>();
- assertionLock = this;
- }
- initialized = true;
+ this(checkCreateClassLoader(), parent);
}
/**
@@ -289,25 +291,7 @@
* of a new class loader.
*/
protected ClassLoader() {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkCreateClassLoader();
- }
- this.parent = getSystemClassLoader();
- if (parallelLoaders.contains(this.getClass())) {
- parallelLockMap = new ConcurrentHashMap<String, Object>();
- package2certs = new ConcurrentHashMap<String, Certificate[]>();
- domains =
- Collections.synchronizedSet(new HashSet<ProtectionDomain>());
- assertionLock = new Object();
- } else {
- // no finer-grained lock; lock on the classloader instance
- parallelLockMap = null;
- package2certs = new Hashtable<String, Certificate[]>();
- domains = new HashSet<ProtectionDomain>();
- assertionLock = this;
- }
- initialized = true;
+ this(checkCreateClassLoader(), getSystemClassLoader());
}
// -- Class --
@@ -742,7 +726,6 @@
ProtectionDomain protectionDomain)
throws ClassFormatError
{
- check();
protectionDomain = preDefineClass(name, protectionDomain);
Class c = null;
@@ -826,8 +809,6 @@
ProtectionDomain protectionDomain)
throws ClassFormatError
{
- check();
-
int len = b.remaining();
// Use byte[] if not a direct ByteBufer:
@@ -972,7 +953,6 @@
* @see #defineClass(String, byte[], int, int)
*/
protected final void resolveClass(Class<?> c) {
- check();
resolveClass0(c);
}
@@ -1003,7 +983,6 @@
protected final Class<?> findSystemClass(String name)
throws ClassNotFoundException
{
- check();
ClassLoader system = getSystemClassLoader();
if (system == null) {
if (!checkName(name))
@@ -1016,7 +995,6 @@
private Class findBootstrapClass0(String name)
throws ClassNotFoundException
{
- check();
if (!checkName(name))
throw new ClassNotFoundException(name);
return findBootstrapClass(name);
@@ -1025,13 +1003,6 @@
private native Class findBootstrapClass(String name)
throws ClassNotFoundException;
- // Check to make sure the class loader has been initialized.
- private void check() {
- if (!initialized) {
- throw new SecurityException("ClassLoader object not initialized");
- }
- }
-
/**
* Returns the class with the given <a href="#name">binary name</a> if this
* loader has been recorded by the Java virtual machine as an initiating
@@ -1047,7 +1018,6 @@
* @since 1.1
*/
protected final Class<?> findLoadedClass(String name) {
- check();
if (!checkName(name))
return null;
return findLoadedClass0(name);
@@ -1068,7 +1038,6 @@
* @since 1.1
*/
protected final void setSigners(Class<?> c, Object[] signers) {
- check();
c.setSigners(signers);
}