42 lines
2.2 KiB
Diff
42 lines
2.2 KiB
Diff
# UNDF: UNDF-2026-000000089
|
|
--- a/platforms/software/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/NodeState.java
|
|
+++ b/platforms/software/dependency-management/src/main/java/org/gradle/api/internal/artifacts/ivyservice/resolveengine/graph/builder/NodeState.java
|
|
@@ -1,6 +1,7 @@
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.ImmutableList;
|
|
+ import java.util.LinkedHashSet;
|
|
import java.util.List;
|
|
+ import java.util.Set;
|
|
|
|
@@ -74,8 +75,8 @@ class NodeState implements DependencyGraphNode {
|
|
|
|
- private final List<EdgeState> incomingEdges = new ArrayList<>();
|
|
+ // CWE-407 fix (gradle-0002): LinkedHashSet gives O(1) contains/remove while
|
|
+ // preserving insertion-order iteration (required by computeModuleResolutionFilter).
|
|
+ private final Set<EdgeState> incomingEdges = new LinkedHashSet<>();
|
|
private final List<EdgeState> outgoingEdges = new ArrayList<>();
|
|
|
|
@@ -210,7 +211,7 @@ class NodeState implements DependencyGraphNode {
|
|
- public List<EdgeState> getIncomingEdges() {
|
|
- return incomingEdges;
|
|
+ public Set<EdgeState> getIncomingEdges() {
|
|
+ return incomingEdges;
|
|
}
|
|
|
|
@@ -671,7 +672,7 @@ class NodeState implements DependencyGraphNode {
|
|
void addIncomingEdge(EdgeState dependencyEdge) {
|
|
- // CWE-407: ArrayList.contains() is O(I) — called O(E) times per node
|
|
- // during dependency graph resolution → O(E * I) per node, O(E²) total.
|
|
- if (!incomingEdges.contains(dependencyEdge)) {
|
|
+ // O(1): LinkedHashSet.add() returns false if already present
|
|
+ if (incomingEdges.add(dependencyEdge)) {
|
|
cachedModuleResolutionFilter = null;
|
|
incomingHash += dependencyEdge.hashCode();
|
|
if (dependencyEdge.isTransitive()) {
|
|
@@ -692,7 +693,7 @@ class NodeState implements DependencyGraphNode {
|
|
void removeIncomingEdge(EdgeState dependencyEdge) {
|
|
- if (incomingEdges.remove(dependencyEdge)) {
|
|
+ if (incomingEdges.remove(dependencyEdge)) { // LinkedHashSet.remove() O(1)
|
|
cachedModuleResolutionFilter = null;
|
|
incomingHash -= dependencyEdge.hashCode();
|