[Bf-blender-cvs] [d11b219d40d] master: Fix T83869: Crash when creating Sequencer in new scene

Richard Antalik noreply at git.blender.org
Thu Dec 17 02:20:04 CET 2020


Commit: d11b219d40d7c72156fd11c335fde27212997957
Author: Richard Antalik
Date:   Thu Dec 17 02:11:22 2020 +0100
Branches: master
https://developer.blender.org/rBd11b219d40d7c72156fd11c335fde27212997957

Fix T83869: Crash when creating Sequencer in new scene

Crash on null dereference in `SEQ_timeline_boundbox()`. This function was
generalized in rB9e4a4c2e996c to work on arbitrary `seqbase`.

Fixed by refactoring `SEQ_timeline_boundbox()` functions to return default
sane values if `seqbase` is `NULL`

Reviewed By: HooglyBoogly

Differential Revision: https://developer.blender.org/D9878

===================================================================

M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/sequencer/SEQ_sequencer.h
M	source/blender/sequencer/intern/sequencer.c
M	source/blender/sequencer/intern/strip_time.c

===================================================================

diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 5ad1e2399f5..d7d601a3c76 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -2305,7 +2305,7 @@ void draw_timeline_seq(const bContext *C, ARegion *region)
 
   UI_view2d_view_ortho(v2d);
   /* Get timeline bound-box, needed for the scroll-bars. */
-  SEQ_timeline_boundbox(scene, ed->seqbasep, &v2d->tot);
+  SEQ_timeline_boundbox(scene, SEQ_active_seqbase_get(ed), &v2d->tot);
   draw_seq_backdrop(v2d);
   UI_view2d_constant_grid_draw(v2d, FPS);
 
diff --git a/source/blender/editors/space_sequencer/sequencer_view.c b/source/blender/editors/space_sequencer/sequencer_view.c
index d2166705943..e12c43b7804 100644
--- a/source/blender/editors/space_sequencer/sequencer_view.c
+++ b/source/blender/editors/space_sequencer/sequencer_view.c
@@ -90,11 +90,7 @@ static int sequencer_view_all_exec(bContext *C, wmOperator *op)
   Scene *scene = CTX_data_scene(C);
   const Editing *ed = BKE_sequencer_editing_get(scene, false);
 
-  if (ed == NULL) {
-    return OPERATOR_FINISHED;
-  }
-
-  SEQ_timeline_boundbox(scene, ed->seqbasep, &box);
+  SEQ_timeline_boundbox(scene, SEQ_active_seqbase_get(ed), &box);
   UI_view2d_smooth_view(C, region, &box, smooth_viewtx);
   return OPERATOR_FINISHED;
 }
diff --git a/source/blender/sequencer/SEQ_sequencer.h b/source/blender/sequencer/SEQ_sequencer.h
index 9b4c88520b4..3a9c23de5cc 100644
--- a/source/blender/sequencer/SEQ_sequencer.h
+++ b/source/blender/sequencer/SEQ_sequencer.h
@@ -194,6 +194,7 @@ struct SequencerToolSettings *SEQ_tool_settings_copy(struct SequencerToolSetting
 struct Editing *BKE_sequencer_editing_get(struct Scene *scene, bool alloc);
 struct Editing *BKE_sequencer_editing_ensure(struct Scene *scene);
 void BKE_sequencer_editing_free(struct Scene *scene, const bool do_id_user);
+struct ListBase *SEQ_active_seqbase_get(const struct Editing *ed);
 void BKE_sequencer_sort(struct Scene *scene);
 struct Sequence *BKE_sequencer_from_elem(ListBase *seqbase, struct StripElem *se);
 struct Sequence *BKE_sequencer_active_get(struct Scene *scene);
diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c
index 82971a30c31..87b608ef141 100644
--- a/source/blender/sequencer/intern/sequencer.c
+++ b/source/blender/sequencer/intern/sequencer.c
@@ -327,6 +327,20 @@ void SEQ_tool_settings_fit_method_set(Scene *scene, eSeqImageFitMethod fit_metho
   tool_settings->fit_method = fit_method;
 }
 
+/**
+ * Get seqbase that is being viewed currently. This can be main seqbase or meta strip seqbase
+ *
+ * \param ed: sequence editor data
+ * \return pointer to active seqbase. returns NULL if ed is NULL
+ */
+ListBase *SEQ_active_seqbase_get(const Editing *ed)
+{
+  if (ed == NULL) {
+    return NULL;
+  }
+
+  return ed->seqbasep;
+}
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c
index 015d81cc217..d9074b2a683 100644
--- a/source/blender/sequencer/intern/strip_time.c
+++ b/source/blender/sequencer/intern/strip_time.c
@@ -361,28 +361,26 @@ float BKE_sequence_get_fps(Scene *scene, Sequence *seq)
  */
 void SEQ_timeline_boundbox(const Scene *scene, const ListBase *seqbase, rctf *rect)
 {
-  float min[2], max[2];
-  min[0] = scene->r.sfra;
-  max[0] = scene->r.efra + 1;
-  min[1] = 0.0;
-  max[1] = 8.0;
+  rect->xmin = scene->r.sfra;
+  rect->xmax = scene->r.efra + 1;
+  rect->ymin = 0.0f;
+  rect->ymax = 8.0f;
+
+  if (seqbase == NULL) {
+    return;
+  }
 
   LISTBASE_FOREACH (Sequence *, seq, seqbase) {
-    if (min[0] > seq->startdisp - 1) {
-      min[0] = seq->startdisp - 1;
+    if (rect->xmin > seq->startdisp - 1) {
+      rect->xmin = seq->startdisp - 1;
     }
-    if (max[0] < seq->enddisp + 1) {
-      max[0] = seq->enddisp + 1;
+    if (rect->xmax < seq->enddisp + 1) {
+      rect->xmax = seq->enddisp + 1;
     }
-    if (max[1] < seq->machine + 2) {
-      max[1] = seq->machine + 2;
+    if (rect->ymax < seq->machine + 2) {
+      rect->ymax = seq->machine + 2;
     }
   }
-
-  rect->xmin = min[0];
-  rect->xmax = max[0];
-  rect->ymin = min[1];
-  rect->ymax = max[1];
 }
 
 /**



More information about the Bf-blender-cvs mailing list