33 lines
1.5 KiB
Diff
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);
|