6636650: (cl) Resurrected ClassLoaders can still have children

Prevent classloader from resurrection

Reviewed-by: hawtin
This commit is contained in:
Valerie Peng 2009-08-20 14:49:31 -07:00
parent 2513311062
commit 3b237a13df

View File

@ -186,11 +186,6 @@ public abstract class ClassLoader {
parallelLoaders.add(ClassLoader.class); 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 // The parent class loader for delegation
// Note: VM hardcoded the offset of this field, thus all new fields // Note: VM hardcoded the offset of this field, thus all new fields
// must be added *after* it. // must be added *after* it.
@ -232,6 +227,31 @@ public abstract class ClassLoader {
private final HashMap<String, Package> packages = private final HashMap<String, Package> packages =
new HashMap<String, Package>(); 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 * Creates a new class loader using the specified parent class loader for
* delegation. * delegation.
@ -252,25 +272,7 @@ public abstract class ClassLoader {
* @since 1.2 * @since 1.2
*/ */
protected ClassLoader(ClassLoader parent) { protected ClassLoader(ClassLoader parent) {
SecurityManager security = System.getSecurityManager(); this(checkCreateClassLoader(), parent);
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;
} }
/** /**
@ -289,25 +291,7 @@ public abstract class ClassLoader {
* of a new class loader. * of a new class loader.
*/ */
protected ClassLoader() { protected ClassLoader() {
SecurityManager security = System.getSecurityManager(); this(checkCreateClassLoader(), getSystemClassLoader());
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;
} }
// -- Class -- // -- Class --
@ -742,7 +726,6 @@ public abstract class ClassLoader {
ProtectionDomain protectionDomain) ProtectionDomain protectionDomain)
throws ClassFormatError throws ClassFormatError
{ {
check();
protectionDomain = preDefineClass(name, protectionDomain); protectionDomain = preDefineClass(name, protectionDomain);
Class c = null; Class c = null;
@ -826,8 +809,6 @@ public abstract class ClassLoader {
ProtectionDomain protectionDomain) ProtectionDomain protectionDomain)
throws ClassFormatError throws ClassFormatError
{ {
check();
int len = b.remaining(); int len = b.remaining();
// Use byte[] if not a direct ByteBufer: // Use byte[] if not a direct ByteBufer:
@ -972,7 +953,6 @@ public abstract class ClassLoader {
* @see #defineClass(String, byte[], int, int) * @see #defineClass(String, byte[], int, int)
*/ */
protected final void resolveClass(Class<?> c) { protected final void resolveClass(Class<?> c) {
check();
resolveClass0(c); resolveClass0(c);
} }
@ -1003,7 +983,6 @@ public abstract class ClassLoader {
protected final Class<?> findSystemClass(String name) protected final Class<?> findSystemClass(String name)
throws ClassNotFoundException throws ClassNotFoundException
{ {
check();
ClassLoader system = getSystemClassLoader(); ClassLoader system = getSystemClassLoader();
if (system == null) { if (system == null) {
if (!checkName(name)) if (!checkName(name))
@ -1016,7 +995,6 @@ public abstract class ClassLoader {
private Class findBootstrapClass0(String name) private Class findBootstrapClass0(String name)
throws ClassNotFoundException throws ClassNotFoundException
{ {
check();
if (!checkName(name)) if (!checkName(name))
throw new ClassNotFoundException(name); throw new ClassNotFoundException(name);
return findBootstrapClass(name); return findBootstrapClass(name);
@ -1025,13 +1003,6 @@ public abstract class ClassLoader {
private native Class findBootstrapClass(String name) private native Class findBootstrapClass(String name)
throws ClassNotFoundException; 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 * 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 * loader has been recorded by the Java virtual machine as an initiating
@ -1047,7 +1018,6 @@ public abstract class ClassLoader {
* @since 1.1 * @since 1.1
*/ */
protected final Class<?> findLoadedClass(String name) { protected final Class<?> findLoadedClass(String name) {
check();
if (!checkName(name)) if (!checkName(name))
return null; return null;
return findLoadedClass0(name); return findLoadedClass0(name);
@ -1068,7 +1038,6 @@ public abstract class ClassLoader {
* @since 1.1 * @since 1.1
*/ */
protected final void setSigners(Class<?> c, Object[] signers) { protected final void setSigners(Class<?> c, Object[] signers) {
check();
c.setSigners(signers); c.setSigners(signers);
} }