31 lines
1.3 KiB
Diff
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
|