java-topology/defects/gradle/patch/gradle-0002-node-state-incoming-edges-hashset.patch

41 lines
2.1 KiB
Diff

--- 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();