Skip to content

Commit ae676fa

Browse files
author
Christian Wimmer
committed
Avoid segfault when ClassInitializationInfo is wrong
1 parent f57cfcb commit ae676fa

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/classinitialization/ClassInitializationInfo.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@
2525
package com.oracle.svm.core.classinitialization;
2626

2727
// Checkstyle: stop
28+
2829
import java.util.concurrent.locks.Condition;
2930
import java.util.concurrent.locks.ReentrantLock;
3031

31-
import com.oracle.svm.core.jdk.InternalVMMethod;
3232
import org.graalvm.compiler.serviceprovider.GraalUnsafeAccess;
3333
import org.graalvm.nativeimage.Platform;
3434
import org.graalvm.nativeimage.Platforms;
3535
import org.graalvm.nativeimage.c.function.CFunctionPointer;
3636

3737
import com.oracle.svm.core.annotate.InvokeJavaFunctionPointer;
3838
import com.oracle.svm.core.hub.DynamicHub;
39+
import com.oracle.svm.core.jdk.InternalVMMethod;
3940
import com.oracle.svm.core.snippets.SubstrateForeignCallTarget;
41+
import com.oracle.svm.core.util.VMError;
4042

4143
import sun.misc.Unsafe;
4244
// Checkstyle: resume
@@ -294,7 +296,7 @@ private static void initialize(ClassInitializationInfo info, DynamicHub hub) {
294296
Throwable exception = null;
295297
try {
296298
/* Step 9: Next, execute the class or interface initialization method of C. */
297-
info.invokeClassInitializer();
299+
info.invokeClassInitializer(hub);
298300
} catch (Throwable ex) {
299301
exception = ex;
300302
}
@@ -372,9 +374,17 @@ private void setInitializationStateAndNotify(InitState state) {
372374
}
373375
}
374376

375-
private void invokeClassInitializer() {
377+
private void invokeClassInitializer(DynamicHub hub) {
376378
if (classInitializer != null) {
377-
((ClassInitializerFunctionPointer) classInitializer.functionPointer).invoke();
379+
ClassInitializerFunctionPointer functionPointer = (ClassInitializerFunctionPointer) classInitializer.functionPointer;
380+
if (functionPointer.isNull()) {
381+
throw invokeClassInitializerError(hub);
382+
}
383+
functionPointer.invoke();
378384
}
379385
}
386+
387+
private static RuntimeException invokeClassInitializerError(DynamicHub hub) {
388+
throw VMError.shouldNotReachHere("No classInitializer.functionPointer for class " + hub.getName());
389+
}
380390
}

0 commit comments

Comments
 (0)