提交 632a610d 编写于 作者: V valeriep

6636650: (cl) Resurrected ClassLoaders can still have children

Summary: Prevent classloader from resurrection
Reviewed-by: hawtin
上级 a09ca6db
......@@ -186,11 +186,6 @@ public abstract class ClassLoader {
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 @@ public abstract class ClassLoader {
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 @@ public abstract class ClassLoader {
* @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 @@ public abstract class ClassLoader {
* 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 @@ public abstract class ClassLoader {
ProtectionDomain protectionDomain)
throws ClassFormatError
{
check();
protectionDomain = preDefineClass(name, protectionDomain);
Class c = null;
......@@ -826,8 +809,6 @@ public abstract class ClassLoader {
ProtectionDomain protectionDomain)
throws ClassFormatError
{
check();
int len = b.remaining();
// Use byte[] if not a direct ByteBufer:
......@@ -972,7 +953,6 @@ public abstract class ClassLoader {
* @see #defineClass(String, byte[], int, int)
*/
protected final void resolveClass(Class<?> c) {
check();
resolveClass0(c);
}
......@@ -1003,7 +983,6 @@ public abstract class ClassLoader {
protected final Class<?> findSystemClass(String name)
throws ClassNotFoundException
{
check();
ClassLoader system = getSystemClassLoader();
if (system == null) {
if (!checkName(name))
......@@ -1016,7 +995,6 @@ public abstract class ClassLoader {
private Class findBootstrapClass0(String name)
throws ClassNotFoundException
{
check();
if (!checkName(name))
throw new ClassNotFoundException(name);
return findBootstrapClass(name);
......@@ -1025,13 +1003,6 @@ public abstract class ClassLoader {
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 @@ public abstract class ClassLoader {
* @since 1.1
*/
protected final Class<?> findLoadedClass(String name) {
check();
if (!checkName(name))
return null;
return findLoadedClass0(name);
......@@ -1068,7 +1038,6 @@ public abstract class ClassLoader {
* @since 1.1
*/
protected final void setSigners(Class<?> c, Object[] signers) {
check();
c.setSigners(signers);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册