26 lines
1.5 KiB
Diff
26 lines
1.5 KiB
Diff
# UNDF: UNDF-2026-000000088
|
|
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/options/OptionReader.java
|
|
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/options/OptionReader.java
|
|
@@ -1,5 +1,6 @@
|
|
import java.util.ArrayList;
|
|
+import java.util.Arrays;
|
|
+import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
+import java.util.Set;
|
|
|
|
@@ -90,9 +92,10 @@ public class OptionReader {
|
|
private static JavaMethod<Object, ?> getOptionValueMethodForOption(List<JavaMethod<Object, ?>> optionValueMethods, OptionElement optionElement) {
|
|
JavaMethod<Object, ?> valueMethod = null;
|
|
for (JavaMethod<Object, ?> optionValueMethod : optionValueMethods) {
|
|
String[] optionNames = getOptionNames(optionValueMethod);
|
|
- // CWE-407: CollectionUtils.toList() allocates a new ArrayList on every iteration
|
|
- // then .contains() scans it linearly — O(A * M * N) total.
|
|
- if (CollectionUtils.toList(optionNames).contains(optionElement.getOptionName())) {
|
|
+ // CWE-407 fix: use a HashSet for O(1) membership instead of a freshly
|
|
+ // allocated ArrayList scanned linearly on every inner-loop iteration.
|
|
+ Set<String> optionNameSet = new HashSet<>(Arrays.asList(optionNames));
|
|
+ if (optionNameSet.contains(optionElement.getOptionName())) {
|
|
if (valueMethod == null) {
|
|
valueMethod = optionValueMethod;
|
|
} else {
|