java-topology/defects/onos/patch/onos-0001-tarjan-visited-hashset.patch

37 lines
1.8 KiB
Diff

# UNDF: UNDF-2026-000000196
--- a/utils/misc/src/main/java/org/onlab/graph/TarjanGraphSearch.java
+++ b/utils/misc/src/main/java/org/onlab/graph/TarjanGraphSearch.java
@@ -98,6 +98,7 @@ public class TarjanGraphSearch<V extends Vertex, E extends Edge<V>>
private int index = 0;
private final Map<V, VertexData<V>> vertexData = new HashMap<>();
private final List<VertexData<V>> visited = new ArrayList<>();
+ private final Set<VertexData<V>> visitedSet = new HashSet<>(); // CWE-407 fix
private SccResult(Graph<V, E> graph) {
this.graph = graph;
@@ -140,12 +141,14 @@ public class TarjanGraphSearch<V extends Vertex, E extends Edge<V>>
// Adds augmentation vertexData for the specified vertex
private VertexData<V> addData(V vertex) {
VertexData<V> d = new VertexData<>(vertex, index);
vertexData.put(vertex, d);
visited.add(0, d);
+ visitedSet.add(d); // CWE-407 fix
index++;
return d;
}
// Indicates whether the given vertex has been visited
private boolean visited(VertexData data) {
- return visited.contains(data);
+ return visitedSet.contains(data); // CWE-407 fix: O(1) HashSet lookup vs O(n) ArrayList
}
// Adds a new cluster for the specified vertex
@@ -156,6 +159,7 @@ public class TarjanGraphSearch<V extends Vertex, E extends Edge<V>>
Set<V> vertexes = new HashSet<>();
do {
nextVertexData = visited.remove(0);
+ visitedSet.remove(nextVertexData); // CWE-407 fix: keep sets in sync
vertexes.add(nextVertexData.vertex);
} while (data != nextVertexData);
return Collections.unmodifiableSet(vertexes);