# 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