[Bf-blender-cvs] [7de290ea086] blender-v3.3-release: Fix crashes running operators in invalid contexts

Campbell Barton noreply at git.blender.org
Sun Aug 28 12:18:38 CEST 2022


Commit: 7de290ea086cbcd063a2d5668a74e0f23bc28339
Author: Campbell Barton
Date:   Sun Aug 28 20:08:18 2022 +1000
Branches: blender-v3.3-release
https://developer.blender.org/rB7de290ea086cbcd063a2d5668a74e0f23bc28339

Fix crashes running operators in invalid contexts

Fix for running operators outside of expected contexts.

- UI_OT_view_drop (poll)
- UI_OT_view_item_rename (poll)
- OBJECT_OT_gpencil_modifier_move_to_index
- OBJECT_OT_modifier_move_to_index
- OBJECT_OT_geometry_nodes_input_attribute_toggle
- OBJECT_OT_geometry_node_tree_copy_assign
- OBJECT_OT_shaderfx_remove
- OBJECT_OT_shaderfx_copy
- POSE_OT_relax (& other pose slide operators).

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

M	source/blender/editors/armature/pose_slide.c
M	source/blender/editors/interface/interface_ops.c
M	source/blender/editors/object/object_gpencil_modifier.c
M	source/blender/editors/object/object_modifier.cc
M	source/blender/editors/object/object_shader_fx.c
M	source/blender/editors/util/ed_draw.c

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

diff --git a/source/blender/editors/armature/pose_slide.c b/source/blender/editors/armature/pose_slide.c
index 3e36a0d233a..5e0ef9217c7 100644
--- a/source/blender/editors/armature/pose_slide.c
+++ b/source/blender/editors/armature/pose_slide.c
@@ -286,8 +286,10 @@ static void pose_slide_exit(bContext *C, wmOperator *op)
   ED_slider_destroy(C, pso->slider);
 
   /* Hide Bone Overlay. */
-  View3D *v3d = pso->area->spacedata.first;
-  v3d->overlay.flag = pso->overlay_flag;
+  if (pso->area) {
+    View3D *v3d = pso->area->spacedata.first;
+    v3d->overlay.flag = pso->overlay_flag;
+  }
 
   /* Free the temp pchan links and their data. */
   poseAnim_mapping_free(&pso->pfLinks);
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 3a5ba9acaac..865aed01aa1 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -2339,6 +2339,9 @@ static bool ui_view_drop_poll(bContext *C)
 {
   const wmWindow *win = CTX_wm_window(C);
   const ARegion *region = CTX_wm_region(C);
+  if (region == NULL) {
+    return false;
+  }
   const uiViewItemHandle *hovered_item = UI_region_views_find_item_at(region, win->eventstate->xy);
 
   return hovered_item != NULL;
@@ -2386,6 +2389,9 @@ static void UI_OT_view_drop(wmOperatorType *ot)
 static bool ui_view_item_rename_poll(bContext *C)
 {
   const ARegion *region = CTX_wm_region(C);
+  if (region == NULL) {
+    return false;
+  }
   const uiViewItemHandle *active_item = UI_region_views_find_active_item(region);
   return active_item != NULL && UI_view_item_can_rename(active_item);
 }
diff --git a/source/blender/editors/object/object_gpencil_modifier.c b/source/blender/editors/object/object_gpencil_modifier.c
index 573f048e6b6..42ac6d166b4 100644
--- a/source/blender/editors/object/object_gpencil_modifier.c
+++ b/source/blender/editors/object/object_gpencil_modifier.c
@@ -680,8 +680,7 @@ static int gpencil_modifier_move_to_index_exec(bContext *C, wmOperator *op)
   Object *ob = ED_object_active_context(C);
   GpencilModifierData *md = gpencil_edit_modifier_property_get(op, ob, 0);
   int index = RNA_int_get(op->ptr, "index");
-
-  if (!ED_object_gpencil_modifier_move_to_index(op->reports, ob, md, index)) {
+  if (!(md && ED_object_gpencil_modifier_move_to_index(op->reports, ob, md, index))) {
     return OPERATOR_CANCELLED;
   }
 
diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc
index e7cfcf48fd3..7645af35c23 100644
--- a/source/blender/editors/object/object_modifier.cc
+++ b/source/blender/editors/object/object_modifier.cc
@@ -1363,7 +1363,7 @@ static int modifier_move_to_index_exec(bContext *C, wmOperator *op)
   ModifierData *md = edit_modifier_property_get(op, ob, 0);
   int index = RNA_int_get(op->ptr, "index");
 
-  if (!ED_object_modifier_move_to_index(op->reports, ob, md, index)) {
+  if (!(md && ED_object_modifier_move_to_index(op->reports, ob, md, index))) {
     return OPERATOR_CANCELLED;
   }
 
@@ -3344,6 +3344,7 @@ void OBJECT_OT_geometry_nodes_input_attribute_toggle(wmOperatorType *ot)
   ot->idname = "OBJECT_OT_geometry_nodes_input_attribute_toggle";
 
   ot->exec = geometry_nodes_input_attribute_toggle_exec;
+  ot->poll = ED_operator_object_active;
 
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
 
@@ -3361,9 +3362,8 @@ static int geometry_node_tree_copy_assign_exec(bContext *C, wmOperator *UNUSED(o
 {
   Main *bmain = CTX_data_main(C);
   Object *ob = ED_object_active_context(C);
-
   ModifierData *md = BKE_object_active_modifier(ob);
-  if (md->type != eModifierType_Nodes) {
+  if (!(md && md->type == eModifierType_Nodes)) {
     return OPERATOR_CANCELLED;
   }
 
@@ -3395,6 +3395,7 @@ void OBJECT_OT_geometry_node_tree_copy_assign(wmOperatorType *ot)
   ot->idname = "OBJECT_OT_geometry_node_tree_copy_assign";
 
   ot->exec = geometry_node_tree_copy_assign_exec;
+  ot->poll = ED_operator_object_active;
 
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
diff --git a/source/blender/editors/object/object_shader_fx.c b/source/blender/editors/object/object_shader_fx.c
index dd7fc192dc1..4b721cb65a1 100644
--- a/source/blender/editors/object/object_shader_fx.c
+++ b/source/blender/editors/object/object_shader_fx.c
@@ -481,12 +481,15 @@ static int shaderfx_remove_exec(bContext *C, wmOperator *op)
   Main *bmain = CTX_data_main(C);
   Object *ob = ED_object_active_context(C);
   ShaderFxData *fx = edit_shaderfx_property_get(op, ob, 0);
+  if (!fx) {
+    return OPERATOR_CANCELLED;
+  }
 
   /* Store name temporarily for report. */
   char name[MAX_NAME];
   strcpy(name, fx->name);
 
-  if (!fx || !ED_object_shaderfx_remove(op->reports, bmain, ob, fx)) {
+  if (!ED_object_shaderfx_remove(op->reports, bmain, ob, fx)) {
     return OPERATOR_CANCELLED;
   }
 
@@ -671,7 +674,9 @@ static int shaderfx_copy_exec(bContext *C, wmOperator *op)
 {
   Object *ob = ED_object_active_context(C);
   ShaderFxData *fx = edit_shaderfx_property_get(op, ob, 0);
-
+  if (!fx) {
+    return OPERATOR_CANCELLED;
+  }
   ShaderFxData *nfx = BKE_shaderfx_new(fx->type);
   if (!nfx) {
     return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/util/ed_draw.c b/source/blender/editors/util/ed_draw.c
index 1b6a3efe19c..0fec8349796 100644
--- a/source/blender/editors/util/ed_draw.c
+++ b/source/blender/editors/util/ed_draw.c
@@ -370,11 +370,13 @@ tSlider *ED_slider_create(struct bContext *C)
   slider->factor = 0.5;
 
   /* Add draw callback. Always in header. */
-  LISTBASE_FOREACH (ARegion *, region, &slider->area->regionbase) {
-    if (region->regiontype == RGN_TYPE_HEADER) {
-      slider->region_header = region;
-      slider->draw_handle = ED_region_draw_cb_activate(
-          region->type, slider_draw, slider, REGION_DRAW_POST_PIXEL);
+  if (slider->area) {
+    LISTBASE_FOREACH (ARegion *, region, &slider->area->regionbase) {
+      if (region->regiontype == RGN_TYPE_HEADER) {
+        slider->region_header = region;
+        slider->draw_handle = ED_region_draw_cb_activate(
+            region->type, slider_draw, slider, REGION_DRAW_POST_PIXEL);
+      }
     }
   }
 
@@ -465,7 +467,9 @@ void ED_slider_status_string_get(const struct tSlider *slider,
 void ED_slider_destroy(struct bContext *C, tSlider *slider)
 {
   /* Remove draw callback. */
-  ED_region_draw_cb_exit(slider->region_header->type, slider->draw_handle);
+  if (slider->draw_handle) {
+    ED_region_draw_cb_exit(slider->region_header->type, slider->draw_handle);
+  }
   ED_area_status_text(slider->area, NULL);
   ED_workspace_status_text(C, NULL);
   MEM_freeN(slider);



More information about the Bf-blender-cvs mailing list