java-topology/defects/kotlin/patch/kotlin-0001-collectreachable-hashset.patch

29 lines
1.3 KiB
Diff

# UNDF: UNDF-2026-000000134
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/NonExpansiveInheritanceRestrictionChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/NonExpansiveInheritanceRestrictionChecker.kt
index 9f32db32..73838c72 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/NonExpansiveInheritanceRestrictionChecker.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/NonExpansiveInheritanceRestrictionChecker.kt
@@ -149,10 +149,13 @@ object NonExpansiveInheritanceRestrictionChecker {
private fun <T> Graph<T>.isEdgeInCycle(edge: ExpansiveEdge<T>) = edge.from in collectReachable(edge.to)
- private fun <T> Graph<T>.collectReachable(from: T): List<T> {
+ // CWE-407 fix: return HashSet<T> so `in` is O(1) instead of O(V) on a List<T>
+ private fun <T> Graph<T>.collectReachable(from: T): Set<T> {
+ val reachable = hashSetOf<T>()
+
val handler = object : DFS.NodeHandlerWithListResult<T, T>() {
override fun afterChildren(current: T?) {
- result.add(current)
+ if (current != null) reachable.add(current)
}
}
@@ -162,6 +165,6 @@ object NonExpansiveInheritanceRestrictionChecker {
DFS.dfs(listOf(from), neighbors, handler)
- return handler.result()
+ return reachable
}
}