Skip to content

Commit a2c7752

Browse files
liachnizarbenalla
andcommittedOct 14, 2024
8317356: Fix missing null checks in the ClassFile API
Co-authored-by: Nizar Benalla <nbenalla@openjdk.org> Reviewed-by: asotona
1 parent 6071346 commit a2c7752

36 files changed

+249
-116
lines changed
 

‎src/java.base/share/classes/java/lang/classfile/AnnotationValue.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
import jdk.internal.classfile.impl.Util;
4343
import jdk.internal.javac.PreviewFeature;
4444

45+
import static java.util.Objects.requireNonNull;
46+
4547
/**
4648
* Models an {@code element_value} structure, or a value of an element-value
4749
* pair of an annotation, as defined in JVMS {@jvms 4.7.16.1}.
@@ -488,6 +490,8 @@ default ClassDesc classSymbol() {
488490
*/
489491
static OfEnum ofEnum(Utf8Entry className,
490492
Utf8Entry constantName) {
493+
requireNonNull(className);
494+
requireNonNull(constantName);
491495
return new AnnotationImpl.OfEnumImpl(className, constantName);
492496
}
493497

@@ -506,6 +510,7 @@ static OfEnum ofEnum(ClassDesc className, String constantName) {
506510
* @param className the descriptor string of the class
507511
*/
508512
static OfClass ofClass(Utf8Entry className) {
513+
requireNonNull(className);
509514
return new AnnotationImpl.OfClassImpl(className);
510515
}
511516

@@ -522,6 +527,7 @@ static OfClass ofClass(ClassDesc className) {
522527
* @param value the string
523528
*/
524529
static OfString ofString(Utf8Entry value) {
530+
requireNonNull(value);
525531
return new AnnotationImpl.OfStringImpl(value);
526532
}
527533

@@ -538,6 +544,7 @@ static OfString ofString(String value) {
538544
* @param value the double value
539545
*/
540546
static OfDouble ofDouble(DoubleEntry value) {
547+
requireNonNull(value);
541548
return new AnnotationImpl.OfDoubleImpl(value);
542549
}
543550

@@ -554,6 +561,7 @@ static OfDouble ofDouble(double value) {
554561
* @param value the float value
555562
*/
556563
static OfFloat ofFloat(FloatEntry value) {
564+
requireNonNull(value);
557565
return new AnnotationImpl.OfFloatImpl(value);
558566
}
559567

@@ -570,6 +578,7 @@ static OfFloat ofFloat(float value) {
570578
* @param value the long value
571579
*/
572580
static OfLong ofLong(LongEntry value) {
581+
requireNonNull(value);
573582
return new AnnotationImpl.OfLongImpl(value);
574583
}
575584

@@ -586,6 +595,7 @@ static OfLong ofLong(long value) {
586595
* @param value the int value
587596
*/
588597
static OfInt ofInt(IntegerEntry value) {
598+
requireNonNull(value);
589599
return new AnnotationImpl.OfIntImpl(value);
590600
}
591601

@@ -602,6 +612,7 @@ static OfInt ofInt(int value) {
602612
* @param value the short value
603613
*/
604614
static OfShort ofShort(IntegerEntry value) {
615+
requireNonNull(value);
605616
return new AnnotationImpl.OfShortImpl(value);
606617
}
607618

@@ -618,6 +629,7 @@ static OfShort ofShort(short value) {
618629
* @param value the char value
619630
*/
620631
static OfChar ofChar(IntegerEntry value) {
632+
requireNonNull(value);
621633
return new AnnotationImpl.OfCharImpl(value);
622634
}
623635

@@ -634,6 +646,7 @@ static OfChar ofChar(char value) {
634646
* @param value the byte value
635647
*/
636648
static OfByte ofByte(IntegerEntry value) {
649+
requireNonNull(value);
637650
return new AnnotationImpl.OfByteImpl(value);
638651
}
639652

@@ -650,6 +663,7 @@ static OfByte ofByte(byte value) {
650663
* @param value the boolean value
651664
*/
652665
static OfBoolean ofBoolean(IntegerEntry value) {
666+
requireNonNull(value);
653667
return new AnnotationImpl.OfBooleanImpl(value);
654668
}
655669

@@ -667,6 +681,7 @@ static OfBoolean ofBoolean(boolean value) {
667681
* @param value the annotation
668682
*/
669683
static OfAnnotation ofAnnotation(Annotation value) {
684+
requireNonNull(value);
670685
return new AnnotationImpl.OfAnnotationImpl(value);
671686
}
672687

@@ -784,6 +799,6 @@ static AnnotationValue of(Object value) {
784799
} else if (value instanceof Enum<?> e) {
785800
return ofEnum(ClassDesc.ofDescriptor(e.getDeclaringClass().descriptorString()), e.name());
786801
}
787-
throw new IllegalArgumentException("Illegal annotation constant value type " + (value == null ? null : value.getClass()));
802+
throw new IllegalArgumentException("Illegal annotation constant value type " + requireNonNull(value).getClass());
788803
}
789804
}

‎src/java.base/share/classes/java/lang/classfile/AttributedElement.java

+4
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import jdk.internal.classfile.impl.AbstractUnboundModel;
3434
import jdk.internal.javac.PreviewFeature;
3535

36+
import static java.util.Objects.requireNonNull;
37+
3638
/**
3739
* A {@link ClassFileElement} describing an entity that has attributes, such
3840
* as a class, field, method, code attribute, or record component.
@@ -58,6 +60,7 @@ public sealed interface AttributedElement extends ClassFileElement
5860
* is not present
5961
*/
6062
default <T extends Attribute<T>> Optional<T> findAttribute(AttributeMapper<T> attr) {
63+
requireNonNull(attr);
6164
for (Attribute<?> la : attributes()) {
6265
if (la.attributeMapper() == attr) {
6366
@SuppressWarnings("unchecked")
@@ -76,6 +79,7 @@ default <T extends Attribute<T>> Optional<T> findAttribute(AttributeMapper<T> at
7679
* is not present
7780
*/
7881
default <T extends Attribute<T>> List<T> findAttributes(AttributeMapper<T> attr) {
82+
requireNonNull(attr);
7983
var list = new ArrayList<T>();
8084
for (var a : attributes()) {
8185
if (a.attributeMapper() == attr) {

‎src/java.base/share/classes/java/lang/classfile/ClassHierarchyResolver.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -39,6 +39,8 @@
3939
import jdk.internal.classfile.impl.Util;
4040

4141
import static java.lang.constant.ConstantDescs.CD_Object;
42+
import static java.util.Objects.requireNonNull;
43+
4244
import jdk.internal.javac.PreviewFeature;
4345

4446
/**
@@ -106,6 +108,7 @@ static ClassHierarchyInfo ofInterface() {
106108
* other resolver in cases where this resolver returns {@code null}.
107109
*/
108110
default ClassHierarchyResolver orElse(ClassHierarchyResolver other) {
111+
requireNonNull(other);
109112
return new ClassHierarchyResolver() {
110113
@Override
111114
public ClassHierarchyInfo getClassInfo(ClassDesc classDesc) {
@@ -170,7 +173,7 @@ public Map<ClassDesc, ClassHierarchyInfo> get() {
170173
* @return the {@linkplain ClassHierarchyResolver}
171174
*/
172175
static ClassHierarchyResolver ofResourceParsing(Function<ClassDesc, InputStream> classStreamResolver) {
173-
return new ClassHierarchyImpl.ResourceParsingClassHierarchyResolver(classStreamResolver);
176+
return new ClassHierarchyImpl.ResourceParsingClassHierarchyResolver(requireNonNull(classStreamResolver));
174177
}
175178

176179
/**
@@ -181,6 +184,7 @@ static ClassHierarchyResolver ofResourceParsing(Function<ClassDesc, InputStream>
181184
* @return the {@linkplain ClassHierarchyResolver}
182185
*/
183186
static ClassHierarchyResolver ofResourceParsing(ClassLoader loader) {
187+
requireNonNull(loader);
184188
return ofResourceParsing(new Function<>() {
185189
@Override
186190
public InputStream apply(ClassDesc classDesc) {
@@ -210,6 +214,7 @@ static ClassHierarchyResolver of(Collection<ClassDesc> interfaces,
210214
* @return the class hierarchy resolver
211215
*/
212216
static ClassHierarchyResolver ofClassLoading(ClassLoader loader) {
217+
requireNonNull(loader);
213218
return new ClassLoadingClassHierarchyResolver(new Function<>() {
214219
@Override
215220
public Class<?> apply(ClassDesc cd) {
@@ -232,6 +237,7 @@ public Class<?> apply(ClassDesc cd) {
232237
* @return the class hierarchy resolver
233238
*/
234239
static ClassHierarchyResolver ofClassLoading(MethodHandles.Lookup lookup) {
240+
requireNonNull(lookup);
235241
return new ClassLoadingClassHierarchyResolver(new Function<>() {
236242
@Override
237243
public Class<?> apply(ClassDesc cd) {

‎src/java.base/share/classes/java/lang/classfile/ClassTransform.java

+9-5
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import jdk.internal.classfile.impl.TransformImpl;
3333
import jdk.internal.javac.PreviewFeature;
3434

35+
import static java.util.Objects.requireNonNull;
36+
3537
/**
3638
* A transformation on streams of {@link ClassElement}.
3739
*
@@ -63,7 +65,7 @@ public void accept(ClassBuilder builder, ClassElement element) {
6365
* @return the stateful class transform
6466
*/
6567
static ClassTransform ofStateful(Supplier<ClassTransform> supplier) {
66-
return new TransformImpl.SupplierClassTransform(supplier);
68+
return new TransformImpl.SupplierClassTransform(requireNonNull(supplier));
6769
}
6870

6971
/**
@@ -74,6 +76,7 @@ static ClassTransform ofStateful(Supplier<ClassTransform> supplier) {
7476
* @return the class transform
7577
*/
7678
static ClassTransform endHandler(Consumer<ClassBuilder> finisher) {
79+
requireNonNull(finisher);
7780
return new ClassTransform() {
7881
@Override
7982
public void accept(ClassBuilder builder, ClassElement element) {
@@ -95,6 +98,7 @@ public void atEnd(ClassBuilder builder) {
9598
* @return the class transform
9699
*/
97100
static ClassTransform dropping(Predicate<ClassElement> filter) {
101+
requireNonNull(filter);
98102
return (b, e) -> {
99103
if (!filter.test(e))
100104
b.with(e);
@@ -111,7 +115,7 @@ static ClassTransform dropping(Predicate<ClassElement> filter) {
111115
*/
112116
static ClassTransform transformingMethods(Predicate<MethodModel> filter,
113117
MethodTransform xform) {
114-
return new TransformImpl.ClassMethodTransform(xform, filter);
118+
return new TransformImpl.ClassMethodTransform(requireNonNull(xform), requireNonNull(filter));
115119
}
116120

117121
/**
@@ -122,7 +126,7 @@ static ClassTransform transformingMethods(Predicate<MethodModel> filter,
122126
* @return the class transform
123127
*/
124128
static ClassTransform transformingMethods(MethodTransform xform) {
125-
return transformingMethods(mm -> true, xform);
129+
return transformingMethods(_ -> true, xform);
126130
}
127131

128132
/**
@@ -157,7 +161,7 @@ static ClassTransform transformingMethodBodies(CodeTransform xform) {
157161
* @return the class transform
158162
*/
159163
static ClassTransform transformingFields(FieldTransform xform) {
160-
return new TransformImpl.ClassFieldTransform(xform, f -> true);
164+
return new TransformImpl.ClassFieldTransform(requireNonNull(xform), _ -> true);
161165
}
162166

163167
/**
@@ -169,6 +173,6 @@ static ClassTransform transformingFields(FieldTransform xform) {
169173
*/
170174
@Override
171175
default ClassTransform andThen(ClassTransform t) {
172-
return new TransformImpl.ChainedClassTransform(this, t);
176+
return new TransformImpl.ChainedClassTransform(this, requireNonNull(t));
173177
}
174178
}

‎src/java.base/share/classes/java/lang/classfile/CodeTransform.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import jdk.internal.classfile.impl.TransformImpl;
3131
import jdk.internal.javac.PreviewFeature;
3232

33+
import static java.util.Objects.requireNonNull;
34+
3335
/**
3436
* A transformation on streams of {@link CodeElement}.
3537
*
@@ -61,7 +63,7 @@ public void accept(CodeBuilder builder, CodeElement element) {
6163
* @return the stateful code transform
6264
*/
6365
static CodeTransform ofStateful(Supplier<CodeTransform> supplier) {
64-
return new TransformImpl.SupplierCodeTransform(supplier);
66+
return new TransformImpl.SupplierCodeTransform(requireNonNull(supplier));
6567
}
6668

6769
/**
@@ -72,6 +74,7 @@ static CodeTransform ofStateful(Supplier<CodeTransform> supplier) {
7274
* @return the code transform
7375
*/
7476
static CodeTransform endHandler(Consumer<CodeBuilder> finisher) {
77+
requireNonNull(finisher);
7578
return new CodeTransform() {
7679
@Override
7780
public void accept(CodeBuilder builder, CodeElement element) {
@@ -94,6 +97,6 @@ public void atEnd(CodeBuilder builder) {
9497
*/
9598
@Override
9699
default CodeTransform andThen(CodeTransform t) {
97-
return new TransformImpl.ChainedCodeTransform(this, t);
100+
return new TransformImpl.ChainedCodeTransform(this, requireNonNull(t));
98101
}
99102
}

‎src/java.base/share/classes/java/lang/classfile/FieldTransform.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import jdk.internal.classfile.impl.TransformImpl;
3232
import jdk.internal.javac.PreviewFeature;
3333

34+
import static java.util.Objects.requireNonNull;
35+
3436
/**
3537
* A transformation on streams of {@link FieldElement}.
3638
*
@@ -62,7 +64,7 @@ public void accept(FieldBuilder builder, FieldElement element) {
6264
* @return the stateful field transform
6365
*/
6466
static FieldTransform ofStateful(Supplier<FieldTransform> supplier) {
65-
return new TransformImpl.SupplierFieldTransform(supplier);
67+
return new TransformImpl.SupplierFieldTransform(requireNonNull(supplier));
6668
}
6769

6870
/**
@@ -73,6 +75,7 @@ static FieldTransform ofStateful(Supplier<FieldTransform> supplier) {
7375
* @return the field transform
7476
*/
7577
static FieldTransform endHandler(Consumer<FieldBuilder> finisher) {
78+
requireNonNull(finisher);
7679
return new FieldTransform() {
7780
@Override
7881
public void accept(FieldBuilder builder, FieldElement element) {
@@ -94,6 +97,7 @@ public void atEnd(FieldBuilder builder) {
9497
* @return the field transform
9598
*/
9699
static FieldTransform dropping(Predicate<FieldElement> filter) {
100+
requireNonNull(filter);
97101
return (b, e) -> {
98102
if (!filter.test(e))
99103
b.with(e);
@@ -109,6 +113,6 @@ static FieldTransform dropping(Predicate<FieldElement> filter) {
109113
*/
110114
@Override
111115
default FieldTransform andThen(FieldTransform t) {
112-
return new TransformImpl.ChainedFieldTransform(this, t);
116+
return new TransformImpl.ChainedFieldTransform(this, requireNonNull(t));
113117
}
114118
}

‎src/java.base/share/classes/java/lang/classfile/MethodTransform.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import jdk.internal.classfile.impl.TransformImpl;
3232
import jdk.internal.javac.PreviewFeature;
3333

34+
import static java.util.Objects.requireNonNull;
35+
3436
/**
3537
* A transformation on streams of {@link MethodElement}.
3638
*
@@ -62,6 +64,7 @@ public void accept(MethodBuilder builder, MethodElement element) {
6264
* @return the stateful method transform
6365
*/
6466
static MethodTransform ofStateful(Supplier<MethodTransform> supplier) {
67+
requireNonNull(supplier);
6568
return new TransformImpl.SupplierMethodTransform(supplier);
6669
}
6770

@@ -73,6 +76,7 @@ static MethodTransform ofStateful(Supplier<MethodTransform> supplier) {
7376
* @return the method transform
7477
*/
7578
static MethodTransform endHandler(Consumer<MethodBuilder> finisher) {
79+
requireNonNull(finisher);
7680
return new MethodTransform() {
7781
@Override
7882
public void accept(MethodBuilder builder, MethodElement element) {
@@ -94,6 +98,7 @@ public void atEnd(MethodBuilder builder) {
9498
* @return the method transform
9599
*/
96100
static MethodTransform dropping(Predicate<MethodElement> filter) {
101+
requireNonNull(filter);
97102
return (b, e) -> {
98103
if (!filter.test(e))
99104
b.with(e);
@@ -108,7 +113,7 @@ static MethodTransform dropping(Predicate<MethodElement> filter) {
108113
* @return the class transform
109114
*/
110115
static MethodTransform transformingCode(CodeTransform xform) {
111-
return new TransformImpl.MethodCodeTransform(xform);
116+
return new TransformImpl.MethodCodeTransform(requireNonNull(xform));
112117
}
113118

114119
/**
@@ -120,6 +125,6 @@ static MethodTransform transformingCode(CodeTransform xform) {
120125
*/
121126
@Override
122127
default MethodTransform andThen(MethodTransform t) {
123-
return new TransformImpl.ChainedMethodTransform(this, t);
128+
return new TransformImpl.ChainedMethodTransform(this, requireNonNull(t));
124129
}
125130
}

0 commit comments

Comments
 (0)
Please sign in to comment.