Skip to content

Commit f6b10d6

Browse files
committed
NullPointerException on null value arguments.
1 parent 1beecc5 commit f6b10d6

File tree

5 files changed

+26
-29
lines changed

5 files changed

+26
-29
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConditionalConfigurationRegistry.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,21 @@ public void setAnalysisAccess(Feature.BeforeAnalysisAccess beforeAnalysisAccess)
107107
pendingReachabilityHandlers.clear();
108108
}
109109

110+
protected void requireNonNull(Object[] values, String kind, String accessKind) {
111+
for (Object value : values) {
112+
Objects.requireNonNull(value, () -> nullErrorMessage(kind, accessKind));
113+
}
114+
}
115+
116+
protected String nullErrorMessage(String elementKind, String accessKind) {
117+
return "Cannot register null value as " + elementKind + " for " + accessKind + ". Please ensure that all values you register are not null.";
118+
}
119+
110120
public void setHostVM(SVMHost hostVM) {
111121
this.hostVM = hostVM;
112122
}
113123

114124
public SVMHost getHostVM() {
115125
return hostVM;
116126
}
117-
118127
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -228,14 +228,14 @@ private final class JNIRuntimeAccessibilitySupportImpl extends ConditionalConfig
228228
@Override
229229
public void register(ConfigurationCondition condition, boolean unsafeAllocated, Class<?> clazz) {
230230
assert !unsafeAllocated : "unsafeAllocated can be only set via Unsafe.allocateInstance, not via JNI.";
231-
Objects.requireNonNull(clazz, () -> nullErrorMessage("class"));
231+
Objects.requireNonNull(clazz, () -> nullErrorMessage("class", "JNI access"));
232232
abortIfSealed();
233233
registerConditionalConfiguration(condition, (cnd) -> newClasses.add(clazz));
234234
}
235235

236236
@Override
237237
public void register(ConfigurationCondition condition, boolean queriedOnly, Executable... executables) {
238-
requireNonNull(executables, "executable");
238+
requireNonNull(executables, "executable", "JNI access");
239239
abortIfSealed();
240240
if (!queriedOnly) {
241241
registerConditionalConfiguration(condition, (cnd) -> newMethods.addAll(Arrays.asList(executables)));
@@ -244,7 +244,7 @@ public void register(ConfigurationCondition condition, boolean queriedOnly, Exec
244244

245245
@Override
246246
public void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields) {
247-
requireNonNull(fields, "field");
247+
requireNonNull(fields, "field", "JNI access");
248248
abortIfSealed();
249249
registerConditionalConfiguration(condition, (cnd) -> registerFields(finalIsWritable, fields));
250250
}
@@ -758,14 +758,4 @@ private static boolean anyFieldMatches(ResolvedJavaType sub, String name) {
758758
return false;
759759
}
760760
}
761-
762-
private static void requireNonNull(Object[] values, String kind) {
763-
for (Object value : values) {
764-
Objects.requireNonNull(value, () -> nullErrorMessage(kind));
765-
}
766-
}
767-
768-
private static String nullErrorMessage(String kind) {
769-
return "Cannot register null value as " + kind + " for JNI access. Please ensure that all values you register are not null.";
770-
}
771761
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ private boolean isQueryFlagSet(Class<?> clazz, int flag) {
202202

203203
@Override
204204
public void register(ConfigurationCondition condition, boolean unsafeInstantiated, Class<?> clazz) {
205-
Objects.requireNonNull(clazz, () -> nullErrorMessage("class"));
205+
Objects.requireNonNull(clazz, () -> nullErrorMessage("class", "reflection"));
206206
runConditionalInAnalysisTask(condition, (cnd) -> {
207207
registerClass(cnd, clazz, unsafeInstantiated, true);
208208
if (FutureDefaultsOptions.completeReflectionTypes()) {
@@ -375,7 +375,7 @@ public void registerAllSignersQuery(ConfigurationCondition condition, Class<?> c
375375

376376
@Override
377377
public void register(ConfigurationCondition condition, boolean queriedOnly, Executable... executables) {
378-
requireNonNull(executables, "executable");
378+
requireNonNull(executables, "executable", "reflection");
379379
runConditionalInAnalysisTask(condition, (cnd) -> registerMethods(cnd, queriedOnly, executables));
380380
}
381381

@@ -554,7 +554,7 @@ public void registerConstructorLookup(ConfigurationCondition condition, Class<?>
554554

555555
@Override
556556
public void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields) {
557-
requireNonNull(fields, "field");
557+
requireNonNull(fields, "field", "reflection");
558558
runConditionalInAnalysisTask(condition, (cnd) -> registerFields(cnd, false, fields));
559559
}
560560

@@ -1391,16 +1391,6 @@ private static int countConditionalElements(Map<? extends AnalysisElement, ? ext
13911391
.reduce(0, Integer::sum);
13921392
}
13931393

1394-
private static void requireNonNull(Object[] values, String kind) {
1395-
for (Object value : values) {
1396-
Objects.requireNonNull(value, () -> nullErrorMessage(kind));
1397-
}
1398-
}
1399-
1400-
private static String nullErrorMessage(String kind) {
1401-
return "Cannot register null value as " + kind + " for reflection. Please ensure that all values you register are not null.";
1402-
}
1403-
14041394
public static class TestBackdoor {
14051395
public static void registerField(ReflectionDataBuilder reflectionDataBuilder, boolean queriedOnly, Field field) {
14061396
reflectionDataBuilder.runConditionalInAnalysisTask(ConfigurationCondition.alwaysTrue(), (cnd) -> reflectionDataBuilder.registerField(cnd, queriedOnly, field));

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/ProxyRegistry.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,9 @@ private static boolean checkClass(List<String> interfaceNames, String className,
9191
private static void warning(List<String> interfaceNames, String reason) {
9292
LogUtils.warning("Cannot register dynamic proxy for interface list: %s. Reason: %s.", String.join(", ", interfaceNames), reason);
9393
}
94+
95+
@Override
96+
protected String nullErrorMessage(String kind) {
97+
return "Cannot register null value as " + kind + ". Please ensure that all values you register are not null.";
98+
}
9499
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@
4747
import java.util.HashSet;
4848
import java.util.List;
4949
import java.util.Map;
50+
import java.util.Objects;
5051
import java.util.Optional;
5152
import java.util.Set;
5253
import java.util.concurrent.ConcurrentHashMap;
5354

55+
import com.oracle.svm.core.util.UserError;
5456
import org.graalvm.nativeimage.ImageSingletons;
5557
import org.graalvm.nativeimage.hosted.Feature;
5658
import org.graalvm.nativeimage.hosted.RuntimeReflection;
@@ -71,7 +73,6 @@
7173
import com.oracle.svm.core.reflect.serialize.SerializationSupport;
7274
import com.oracle.svm.core.reflect.target.ReflectionSubstitutionSupport;
7375
import com.oracle.svm.core.util.BasedOnJDKFile;
74-
import com.oracle.svm.core.util.UserError;
7576
import com.oracle.svm.core.util.VMError;
7677
import com.oracle.svm.hosted.ConditionalConfigurationRegistry;
7778
import com.oracle.svm.hosted.ConfigurationTypeResolver;
@@ -310,6 +311,7 @@ private void abortIfSealed() {
310311

311312
@Override
312313
public void registerIncludingAssociatedClasses(ConfigurationCondition condition, Class<?> clazz) {
314+
Objects.requireNonNull(clazz, () -> nullErrorMessage("class", "serialization"));
313315
registerIncludingAssociatedClasses(condition, clazz, new HashSet<>());
314316
}
315317

@@ -365,7 +367,7 @@ private void registerIncludingAssociatedClasses(ConfigurationCondition condition
365367
@Override
366368
public void registerLambdaCapturingClass(ConfigurationCondition condition, String lambdaCapturingClassName) {
367369
abortIfSealed();
368-
370+
Objects.requireNonNull(lambdaCapturingClassName, () -> nullErrorMessage("lambda capturing class", "serialization"));
369371
Class<?> lambdaCapturingClass = typeResolver.resolveType(lambdaCapturingClassName);
370372
if (lambdaCapturingClass == null || lambdaCapturingClass.isPrimitive() || lambdaCapturingClass.isArray()) {
371373
return;
@@ -407,6 +409,7 @@ public void register(ConfigurationCondition condition, String targetClassName) {
407409
@Override
408410
public void register(ConfigurationCondition condition, Class<?> serializationTargetClass) {
409411
abortIfSealed();
412+
Objects.requireNonNull(serializationTargetClass, () -> nullErrorMessage("class", "serialization"));
410413
registerConditionalConfiguration(condition, (cnd) -> {
411414
/*
412415
* Register class for reflection as it is needed when the class-value itself is

0 commit comments

Comments
 (0)