java-topology/defects/kdenlive/patch/kdenlive-0004-timelinemodel-resize-all-items-linear-find.patch

33 lines
1.5 KiB
Diff

# UNDF: UNDF-2026-000000801
# UNDF: (leave blank)
# Defect: kdenlive-0004
# Component: src/timeline2/model/timelinemodel.cpp — requestClipResizeAndTimeWarp
# Pattern: CWE-407 — all_items std::list<int> with std::find inside loop over currentSelection
# Severity: MEDIUM — O(N^2) where N = current selection size
# Fix: Use unordered_set for dedup check alongside the list
--- a/src/timeline2/model/timelinemodel.cpp
+++ b/src/timeline2/model/timelinemodel.cpp
@@ -3577,6 +3577,7 @@
std::list<int> all_items;
std::unordered_set<int> selectionOnlyItems;
+ std::unordered_set<int> all_items_set;
//first item has to be the item being resized
all_items.push_back(itemId);
+ all_items_set.insert(itemId);
bool isSplitItemPresent = false;
@@ -3591,6 +3592,7 @@
all_items.push_back(splitId);
+ all_items_set.insert(splitId);
isSplitItemPresent = true;
@@ -3594,6 +3596,7 @@
all_items.push_back(splitId);
+ all_items_set.insert(splitId);
isSplitItemPresent = true;
@@ -3603,7 +3606,7 @@
- if (id == itemId || std::find(all_items.begin(), all_items.end(), id) != all_items.end() || !isClip(id)) {
+ if (id == itemId || all_items_set.count(id) || !isClip(id)) {
continue;
}
all_items.push_back(id);
+ all_items_set.insert(id);
selectionOnlyItems.insert(id);