[multimedia/kdenlive/release/26.08] src/timeline2: Fix allowing 0 length composition causing crash

Jean-Baptiste Mardelle <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 3c360c62be755be4c74dcab0136aaea07a139137 by Jean-Baptiste Mardelle.
Committed on 22/07/2026 at 05:35.
Pushed by mardelle into branch 'release/26.08'.

Fix allowing 0 length composition causing crash
Related to #2218

M  +1    -3    src/timeline2/model/timelinemodel.cpp
M  +6    -2    src/timeline2/view/timelinecontroller.cpp

https://invent.kde.org/multimedia/kdenlive/-/commit/3c360c62be755be4c74dcab0136aaea07a139137

diff --git a/src/timeline2/model/timelinemodel.cpp b/src/timeline2/model/timelinemodel.cpp
index 3a8df7d359..547d83ba36 100644
--- a/src/timeline2/model/timelinemodel.cpp
+++ b/src/timeline2/model/timelinemodel.cpp
@@ -6239,6 +6239,7 @@ bool TimelineModel::requestCompositionInsertion(const QString &transitionId, int
     // TRACE(transitionId, trackId, position, length, transProps.get(), id, logUndo);
     Fun undo = []() { return true; };
     Fun redo = []() { return true; };
+    Q_ASSERT(length > 0);
     bool result = requestCompositionInsertion(transitionId, trackId, -1, position, length, std::move(transProps), id, undo, redo, logUndo);
     if (result && logUndo) {
         PUSH_UNDO(undo, redo, i18n("Insert Composition"));
@@ -6282,9 +6283,6 @@ bool TimelineModel::requestCompositionInsertion(const QString &transitionId, int
         return true;
     };
     bool res = requestCompositionMove(compositionId, trackId, compositionTrack, position, true, finalMove, local_undo, local_redo);
-    if (res) {
-        res = requestItemResize(compositionId, length, true, true, local_undo, local_redo, true);
-    }
     if (!res) {
         bool undone = local_undo();
         Q_ASSERT(undone);
diff --git a/src/timeline2/view/timelinecontroller.cpp b/src/timeline2/view/timelinecontroller.cpp
index 143d60f8ce..49e110df4a 100644
--- a/src/timeline2/view/timelinecontroller.cpp
+++ b/src/timeline2/view/timelinecontroller.cpp
@@ -637,16 +637,20 @@ int TimelineController::insertNewComposition(int tid, int clipId, int offset, QS
     bool isShortComposition = TransitionsRepository::get()->getType(transitionId) == AssetListType::AssetType::VideoShortComposition;
     if (duration < 0 || (isShortComposition && duration > 1.5 * defaultLength)) {
         duration = defaultLength;
-    } else if (duration <= 1) {
+    } else if (duration <= 1 && duration < clip_duration) {
         // if suggested composition duration is lower than 4 frames, use default
         duration = pCore->getDurationFromString(KdenliveSettings::transition_duration());
         if (minimumPos + clip_duration - position < 3) {
-            position = minimumPos + clip_duration - duration;
+            position = qMax(minimumPos, minimumPos + clip_duration - duration);
         }
     }
     QPair<int, int> finalPos = m_model->getTrackById_const(tid)->validateCompositionLength(position, offset, duration, endPos);
     position = finalPos.first;
     duration = finalPos.second;
+    if (duration == 0) {
+        pCore->displayMessage(i18n("Could not add composition at selected position"), ErrorMessage, 500);
+        return -1;
+    }
 
     std::unique_ptr<Mlt::Properties> props(nullptr);
     if (TransitionsRepository::get()->isLuma(transitionId)) {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.