Review Request: JDK-8211921,,AssertionError in MethodHandles$Lookup.defineClass
Mandy Chung
mandy.chung at oracle.com
Wed Oct 10 20:38:07 UTC 2018
The assertion in Lookup::defineClass ensures that the resulting
Class is defined with the same loader in the same package in
the same protection domain as the lookup class. When a class
is defined to the boot loader, its protection domain is set to
null which implies AllPermission but Class::getProtectionDomain
however does not guarantee to return the same PD instance. Hence
the assertion may fail when 2+ threads are getting PD at the same
time.
This assertion is not strictly necessary and
test/jdk/java/lang/invoke/DefineClassTest.java verifies these
properties of the resulting Class. I propose to remove this
assertion.
diff --git
a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java
@@ -969,9 +969,6 @@
ProtectionDomain pd = (loader != null) ?
lookupClassProtectionDomain() : null;
String source = "__Lookup_defineClass__";
Class<?> clazz =
SharedSecrets.getJavaLangAccess().defineClass(loader, cn, bytes, pd,
source);
- assert clazz.getClassLoader() == lookupClass.getClassLoader()
- &&
clazz.getPackageName().equals(lookupClass.getPackageName())
- && protectionDomain(clazz) ==
lookupClassProtectionDomain();
return clazz;
}
Mandy
More information about the core-libs-dev
mailing list