java-topology/defects/gitlab-foss/patch/gitlab-foss-0001-network-graph-find-free-space-array-include.patch

31 lines
1.3 KiB
Diff

# UNDF: UNDF-2026-000000853
# UNDF: (leave blank)
# CWE-407: Network::Graph#find_free_space reserved Array#include? in while loop
# Severity: MEDIUM-HIGH
# Speedup: ~250x at 500 reserved spaces
# File: app/models/network/graph.rb
# The find_free_space method collects all reserved spaces into an Array,
# deduplicates with uniq!, then probes with Array#include? inside a while
# loop searching for the first unreserved space number. Each include?
# call is O(R) where R = number of unique reserved spaces. The while loop
# iterates until a free space is found, making total cost O(R * S) where
# S = number of spaces probed. With max_count=650 commits and many
# branches, R can grow to hundreds.
# Fix: convert reserved to a Set after uniq! for O(1) membership test.
--- a/app/models/network/graph.rb
+++ b/app/models/network/graph.rb
@@ -247,12 +247,13 @@ module Network
def find_free_space(time_range, space_step, space_base = 1, space_default = nil)
space_default ||= space_base
- reserved = []
+ reserved = Set.new
time_range.each do |day|
- reserved.push(*@reserved[day])
+ @reserved[day].each { |s| reserved.add(s) }
end
- reserved.uniq!
space = space_default
while reserved.include?(space)
space += space_step