Skip to content

Commit

Permalink
8255578: [JVMCI] be more careful about reflective reads of Class.comp…
Browse files Browse the repository at this point in the history
…onentType.

Reviewed-by: kvn, dlong
  • Loading branch information
Tom Rodriguez committed Nov 2, 2020
1 parent 05bcd67 commit bc6085b
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/hotspot/share/classfile/javaClasses.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,8 @@ class java_lang_Class : AllStatic {
static oop class_data(oop java_class);
static void set_class_data(oop java_class, oop classData);

static int component_mirror_offset() { return _component_mirror_offset; }

static oop class_loader(oop java_class);
static void set_module(oop java_class, oop module);
static oop module(oop java_class);
Expand Down
15 changes: 15 additions & 0 deletions src/hotspot/share/jvmci/jvmciCompilerToVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1995,6 +1995,14 @@ C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object,
JVMCI_THROW_MSG_NULL(IllegalArgumentException,
err_msg("Unexpected type: %s", JVMCIENV->klass_name(base)));
}

if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(obj()) &&
!java_lang_Class::as_Klass(obj())->is_array_klass()) {
// Class.componentType for non-array classes can transiently contain an int[] that's
// used for locking so always return null to mimic Class.getComponentType()
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
}

jlong value = 0;
JVMCIObject kind;
switch (constant_type) {
Expand Down Expand Up @@ -2220,6 +2228,13 @@ C2V_VMENTRY_NULL(jobject, getObject, (JNIEnv* env, jobject, jobject x, long disp
JVMCI_THROW_0(NullPointerException);
}
Handle xobj = JVMCIENV->asConstant(JVMCIENV->wrap(x), JVMCI_CHECK_0);
if (displacement == java_lang_Class::component_mirror_offset() && java_lang_Class::is_instance(xobj()) &&
!java_lang_Class::as_Klass(xobj())->is_array_klass()) {
// Class.componentType for non-array classes can transiently contain an int[] that's
// used for locking so always return null to mimic Class.getComponentType()
return JVMCIENV->get_jobject(JVMCIENV->get_JavaConstant_NULL_POINTER());
}

oop res = xobj->obj_field(displacement);
JVMCIObject result = JVMCIENV->get_object_constant(res);
return JVMCIENV->get_jobject(result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,14 @@ JavaConstant readFieldValue(HotSpotResolvedJavaField field, Object obj, boolean
assert obj != null;
assert !field.isStatic() || obj instanceof Class;
long displacement = field.getOffset();
if (obj instanceof Class && field.getName().equals("componentType")) {
Class<?> clazz = (Class<?>) obj;
if (!clazz.isArray()) {
// Class.componentType for non-array classes can transiently contain an int[] that's
// used for locking so always return null to mimic Class.getComponentType()
return JavaConstant.NULL_POINTER;
}
}

assert checkRead(field.getJavaKind(), displacement,
(HotSpotResolvedObjectType) runtime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(field.isStatic() ? (Class<?>) obj : obj.getClass()),
Expand Down

0 comments on commit bc6085b

Please sign in to comment.