6636650: (cl) Resurrected ClassLoaders can still have children
Prevent classloader from resurrection Reviewed-by: hawtin
This commit is contained in:
parent
2513311062
commit
3b237a13df
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user