Skip to content

Commit 2c77276

Browse files
committed
Prevent CremaSupport from being reachable from DebuggerFeature.
1 parent 8cc69f8 commit 2c77276

File tree

4 files changed

+34
-15
lines changed

4 files changed

+34
-15
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/DynamicHub.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393

9494
import com.oracle.svm.configure.ClassNameSupport;
9595
import com.oracle.svm.configure.config.SignatureUtil;
96-
9796
import com.oracle.svm.core.AlwaysInline;
9897
import com.oracle.svm.core.BuildPhaseProvider.AfterHeapLayout;
9998
import com.oracle.svm.core.BuildPhaseProvider.AfterHostedUniverse;
@@ -483,7 +482,9 @@ public static DynamicHub allocate(String name, DynamicHub superHub, Object inter
483482
int[] interfaceHashTableHeapArray,
484483
int openTypeWorldInterfaceHashParam,
485484
int vTableEntries,
486-
int[] declaredInstanceReferenceFieldOffsets, int afterFieldsOffset, boolean valueBased) {
485+
int[] declaredInstanceReferenceFieldOffsets,
486+
int afterFieldsOffset,
487+
boolean valueBased) {
487488
VMError.guarantee(RuntimeClassLoading.isSupported());
488489

489490
ReferenceType referenceType = ReferenceType.computeReferenceType(DynamicHub.toClass(superHub));

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedJavaFieldImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@
2424
*/
2525
package com.oracle.svm.interpreter.metadata;
2626

27+
import com.oracle.svm.core.hub.DynamicHub;
2728
import com.oracle.svm.core.hub.crema.CremaResolvedJavaField;
29+
import com.oracle.svm.core.hub.crema.CremaSupport;
2830
import com.oracle.svm.espresso.classfile.ParserField;
2931

32+
import jdk.vm.ci.meta.UnresolvedJavaType;
33+
3034
public class CremaResolvedJavaFieldImpl extends InterpreterResolvedJavaField implements CremaResolvedJavaField {
3135
public static final CremaResolvedJavaFieldImpl[] EMPTY_ARRAY = new CremaResolvedJavaFieldImpl[0];
3236

@@ -43,6 +47,14 @@ public static CremaResolvedJavaFieldImpl createAtRuntime(InterpreterResolvedObje
4347
return new CremaResolvedJavaFieldImpl(declaringClass, f, offset);
4448
}
4549

50+
public InterpreterResolvedJavaType getResolvedType() {
51+
if (resolvedType == null) {
52+
Class<?> cls = CremaSupport.singleton().resolveOrThrow(UnresolvedJavaType.create(getSymbolicType().toString()), getDeclaringClass());
53+
resolvedType = (InterpreterResolvedJavaType) DynamicHub.fromClass(cls).getInterpreterType();
54+
}
55+
return resolvedType;
56+
}
57+
4658
@Override
4759
public boolean isTrustedFinal() {
4860
return isFinal() && (isStatic() || Record.class.isAssignableFrom(getDeclaringClass().getJavaClass()) /*- GR-69549: || getDeclaringClass().isHidden() */);

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaField.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import com.oracle.graal.pointsto.meta.AnalysisField;
3434
import com.oracle.svm.core.hub.DynamicHub;
35+
import com.oracle.svm.core.hub.RuntimeClassLoading;
3536
import com.oracle.svm.core.hub.crema.CremaSupport;
3637
import com.oracle.svm.core.hub.registry.SymbolsSupport;
3738
import com.oracle.svm.core.util.VMError;
@@ -62,7 +63,7 @@ public class InterpreterResolvedJavaField implements ResolvedJavaField, CremaFie
6263
private int offset;
6364

6465
private final InterpreterResolvedObjectType declaringClass;
65-
private InterpreterResolvedJavaType resolvedType;
66+
protected InterpreterResolvedJavaType resolvedType;
6667

6768
private final boolean isWordStorage;
6869

@@ -189,21 +190,28 @@ public final Symbol<Name> getSymbolicName() {
189190
}
190191

191192
@Override
192-
public final JavaType getType() {
193+
public JavaType getType() {
193194
/*
194195
* For fields created at build-time, the type is set if it is available. We explicitly do
195196
* not want to trigger field type resolution at build-time.
196197
*
197-
* If the resolvedType is null, the type was not included in the image. If we were to create
198-
* a ResolvedJavaType for it, we would force it back in.
198+
* If the resolvedType is null, the type was not included in the image. If we were to
199+
* eagerly create a ResolvedJavaType for it, we would force it back in.
199200
*/
200201
if (resolvedType == null) {
201202
UnresolvedJavaType unresolvedJavaType = UnresolvedJavaType.create(typeSymbol.toString());
203+
Class<?> cls = null;
202204
/*
203-
* This should not trigger actual class loading. Instead, we query the loader registry
204-
* for an already loaded class.
205+
* Prevent CremaSupport from being reached from other users of
206+
* InterpreterResolvedJavaField.
205207
*/
206-
Class<?> cls = CremaSupport.singleton().findLoadedClass(unresolvedJavaType, getDeclaringClass());
208+
if (RuntimeClassLoading.isSupported()) {
209+
/*
210+
* This should not trigger actual class loading. Instead, we query the loader
211+
* registry for an already loaded class.
212+
*/
213+
cls = CremaSupport.singleton().findLoadedClass(unresolvedJavaType, getDeclaringClass());
214+
}
207215
if (cls == null) {
208216
// Not loaded: return the unresolved type
209217
return unresolvedJavaType;
@@ -215,10 +223,6 @@ public final JavaType getType() {
215223
}
216224

217225
public InterpreterResolvedJavaType getResolvedType() {
218-
if (resolvedType == null) {
219-
Class<?> cls = CremaSupport.singleton().resolveOrThrow(UnresolvedJavaType.create(typeSymbol.toString()), getDeclaringClass());
220-
resolvedType = (InterpreterResolvedJavaType) DynamicHub.fromClass(cls).getInterpreterType();
221-
}
222226
return resolvedType;
223227
}
224228

substratevm/src/com.oracle.svm.jdwp.resident/src/com/oracle/svm/jdwp/resident/impl/ResidentJDWP.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,8 +1802,10 @@ private static void sharedWriteField(Packet.Reader reader, Object typeOrReceiver
18021802
case Object -> {
18031803
assert !field.isWordStorage() : field; // handled above
18041804
Object value = readReferenceOrNull(reader);
1805-
if (value != null && !field.getResolvedType().getJavaClass().isInstance(value)) {
1806-
throw JDWPException.raise(ErrorCode.TYPE_MISMATCH);
1805+
if (field.getResolvedType() != null) {
1806+
if (value != null && !field.getResolvedType().getJavaClass().isInstance(value)) {
1807+
throw JDWPException.raise(ErrorCode.TYPE_MISMATCH);
1808+
}
18071809
}
18081810
InterpreterToVM.setFieldObject(value, receiver, field);
18091811
}

0 commit comments

Comments
 (0)