[Bf-blender-cvs] [5e9dba822d8] master: Cleanup: Avoid error prone pointer storage in SnapObjectParams

Campbell Barton noreply at git.blender.org
Wed Dec 8 16:06:05 CET 2021


Commit: 5e9dba822d8de977909bf170dcae9950535e01af
Author: Campbell Barton
Date:   Wed Dec 8 11:59:58 2021 -0300
Branches: master
https://developer.blender.org/rB5e9dba822d8de977909bf170dcae9950535e01af

Cleanup: Avoid error prone pointer storage in SnapObjectParams

eed48a73222efb86b53cdd99079f8c26eba30e57 caused the `SnapObjectParams` to be stored in the `SnapObjectContext`.

As this pointer is always passing in stack memory, so it seems error prone to keep a reference to this in `SnapObjectContext` since failure to set this will reference undefined stack memory.

So avoid this by moving params out of `SnapObjectContext`.

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

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

M	source/blender/editors/transform/transform_snap_object.c

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

diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index 7caa626fe78..9fd3eada9e9 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -125,8 +125,6 @@ struct SnapObjectContext {
     const ARegion *region;
     const View3D *v3d;
 
-    const struct SnapObjectParams *params;
-
     float mval[2];
     float pmat[4][4];  /* perspective matrix */
     float win_size[2]; /* win x and y */
@@ -444,6 +442,7 @@ static SnapObjectData *snap_object_data_editmesh_get(SnapObjectContext *sctx,
  * \{ */
 
 typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx,
+                                     const struct SnapObjectParams *params,
                                      Object *ob_eval,
                                      float obmat[4][4],
                                      bool is_object_active,
@@ -453,16 +452,17 @@ typedef void (*IterSnapObjsCallback)(SnapObjectContext *sctx,
  * Walks through all objects in the scene to create the list of objects to snap.
  */
 static void iter_snap_objects(SnapObjectContext *sctx,
+                              const struct SnapObjectParams *params,
                               IterSnapObjsCallback sob_callback,
                               void *data)
 {
   ViewLayer *view_layer = DEG_get_input_view_layer(sctx->runtime.depsgraph);
-  const eSnapSelect snap_select = sctx->runtime.params->snap_select;
+  const eSnapSelect snap_select = params->snap_select;
 
   Base *base_act = view_layer->basact;
   if (snap_select == SNAP_ONLY_ACTIVE) {
     Object *obj_eval = DEG_get_evaluated_object(sctx->runtime.depsgraph, base_act->object);
-    sob_callback(sctx, obj_eval, obj_eval->obmat, true, data);
+    sob_callback(sctx, params, obj_eval, obj_eval->obmat, true, data);
     return;
   }
 
@@ -500,12 +500,12 @@ static void iter_snap_objects(SnapObjectContext *sctx,
       ListBase *lb = object_duplilist(sctx->runtime.depsgraph, sctx->scene, obj_eval);
       for (DupliObject *dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next) {
         BLI_assert(DEG_is_evaluated_object(dupli_ob->ob));
-        sob_callback(sctx, dupli_ob->ob, dupli_ob->mat, is_object_active, data);
+        sob_callback(sctx, params, dupli_ob->ob, dupli_ob->mat, is_object_active, data);
       }
       free_object_duplilist(lb);
     }
 
-    sob_callback(sctx, obj_eval, obj_eval->obmat, is_object_active, data);
+    sob_callback(sctx, params, obj_eval, obj_eval->obmat, is_object_active, data);
   }
 }
 
@@ -665,6 +665,7 @@ static void editmesh_looptri_raycast_backface_culling_cb(void *userdata,
 }
 
 static bool raycastMesh(SnapObjectContext *sctx,
+                        const struct SnapObjectParams *params,
                         const float ray_start[3],
                         const float ray_dir[3],
                         Object *ob_eval,
@@ -773,7 +774,7 @@ static bool raycastMesh(SnapObjectContext *sctx,
                              ray_normal_local,
                              0.0f,
                              &hit,
-                             sctx->runtime.params->use_backface_culling ?
+                             params->use_backface_culling ?
                                  mesh_looptri_raycast_backface_culling_cb :
                                  treedata->raycast_callback,
                              treedata) != -1) {
@@ -805,6 +806,7 @@ static bool raycastMesh(SnapObjectContext *sctx,
 }
 
 static bool raycastEditMesh(SnapObjectContext *sctx,
+                            const struct SnapObjectParams *params,
                             const float ray_start[3],
                             const float ray_dir[3],
                             Object *ob_eval,
@@ -943,7 +945,7 @@ static bool raycastEditMesh(SnapObjectContext *sctx,
                              ray_normal_local,
                              0.0f,
                              &hit,
-                             sctx->runtime.params->use_backface_culling ?
+                             params->use_backface_culling ?
                                  editmesh_looptri_raycast_backface_culling_cb :
                                  treedata->raycast_callback,
                              treedata) != -1) {
@@ -998,8 +1000,12 @@ struct RaycastObjUserData {
  *
  * \note Duplicate args here are documented at #snapObjectsRay
  */
-static void raycast_obj_fn(
-    SnapObjectContext *sctx, Object *ob_eval, float obmat[4][4], bool is_object_active, void *data)
+static void raycast_obj_fn(SnapObjectContext *sctx,
+                           const struct SnapObjectParams *params,
+                           Object *ob_eval,
+                           float obmat[4][4],
+                           bool is_object_active,
+                           void *data)
 {
   struct RaycastObjUserData *dt = data;
   const uint ob_index = dt->ob_index++;
@@ -1018,13 +1024,14 @@ static void raycast_obj_fn(
 
   switch (ob_eval->type) {
     case OB_MESH: {
-      const eSnapEditType edit_mode_type = sctx->runtime.params->edit_mode_type;
+      const eSnapEditType edit_mode_type = params->edit_mode_type;
       bool use_hide = false;
       Mesh *me_eval = mesh_for_snap(ob_eval, edit_mode_type, &use_hide);
       if (me_eval == NULL) {
         /* Operators only update the editmesh looptris of the original mesh. */
         BMEditMesh *em_orig = BKE_editmesh_from_object(DEG_get_original_object(ob_eval));
         retval = raycastEditMesh(sctx,
+                                 params,
                                  dt->ray_start,
                                  dt->ray_dir,
                                  ob_eval,
@@ -1039,6 +1046,7 @@ static void raycast_obj_fn(
         break;
       }
       retval = raycastMesh(sctx,
+                           params,
                            dt->ray_start,
                            dt->ray_dir,
                            ob_eval,
@@ -1060,6 +1068,7 @@ static void raycast_obj_fn(
         const Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob_eval);
         if (mesh_eval) {
           retval = raycastMesh(sctx,
+                               params,
                                dt->ray_start,
                                dt->ray_dir,
                                ob_eval,
@@ -1115,6 +1124,7 @@ static void raycast_obj_fn(
  * \param r_hit_list: List of #SnapObjectHitDepth (caller must free).
  */
 static bool raycastObjects(SnapObjectContext *sctx,
+                           const struct SnapObjectParams *params,
                            const float ray_start[3],
                            const float ray_dir[3],
                            /* read/write args */
@@ -1129,7 +1139,6 @@ static bool raycastObjects(SnapObjectContext *sctx,
                            float r_obmat[4][4],
                            ListBase *r_hit_list)
 {
-  const struct SnapObjectParams *params = sctx->runtime.params;
   const View3D *v3d = sctx->runtime.v3d;
   if (params->use_occlusion_test && v3d && XRAY_FLAG_ENABLED(v3d)) {
     /* General testing of occlusion geometry is disabled if the snap is not intended for the edit
@@ -1154,7 +1163,7 @@ static bool raycastObjects(SnapObjectContext *sctx,
       .ret = false,
   };
 
-  iter_snap_objects(sctx, raycast_obj_fn, &data);
+  iter_snap_objects(sctx, params, raycast_obj_fn, &data);
 
   return data.ret;
 }
@@ -1531,6 +1540,7 @@ static void cb_snap_tri_verts(void *userdata,
  * \{ */
 
 static short snap_mesh_polygon(SnapObjectContext *sctx,
+                               const struct SnapObjectParams *params,
                                Object *ob_eval,
                                const float obmat[4][4],
                                /* read/write args */
@@ -1564,10 +1574,8 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
   BLI_assert(sod != NULL);
 
   Nearest2dUserData nearest2d;
-  nearest2d_data_init(sod,
-                      sctx->runtime.view_proj == VIEW_PROJ_PERSP,
-                      sctx->runtime.params->use_backface_culling,
-                      &nearest2d);
+  nearest2d_data_init(
+      sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d);
 
   if (sod->type == SNAP_MESH) {
     BVHTreeFromMesh *treedata = &sod->treedata_mesh;
@@ -1657,6 +1665,7 @@ static short snap_mesh_polygon(SnapObjectContext *sctx,
 }
 
 static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
+                                        const struct SnapObjectParams *params,
                                         Object *ob_eval,
                                         const float obmat[4][4],
                                         float original_dist_px,
@@ -1678,10 +1687,8 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
   BLI_assert(sod != NULL);
 
   Nearest2dUserData nearest2d;
-  nearest2d_data_init(sod,
-                      sctx->runtime.view_proj == VIEW_PROJ_PERSP,
-                      sctx->runtime.params->use_backface_culling,
-                      &nearest2d);
+  nearest2d_data_init(
+      sod, sctx->runtime.view_proj == VIEW_PROJ_PERSP, params->use_backface_culling, &nearest2d);
 
   int vindex[2];
   nearest2d.get_edge_verts_index(*r_index, nearest2d.userdata, vindex);
@@ -1806,6 +1813,7 @@ static short snap_mesh_edge_verts_mixed(SnapObjectContext *sctx,
 }
 
 static short snapArmature(SnapObjectContext *sctx,
+                          const struct SnapObjectParams *params,
                           Object *ob_eval,
                           const float obmat[4][4],
                           /* read/write args */
@@ -1849,7 +1857,7 @@ static short snapArmature(SnapObjectContext *sctx,
     mul_v4_m4v4(clip_planes_local[i], tobmat, sctx->runtime.clip_plane[i]);
   }
 
-  const eSnapSelect snap_select = sctx->runtime.params->snap_select;
+  const eSnapSelect snap_select = params->snap_select;
   bool is_persp = sctx->runtime.view_proj == VIEW_PROJ_PERSP;
 
   bArmature *arm = ob_eval->data;
@@ -1963,6 +1971,7 @@ static short snapArmature(SnapObjectContext *sctx,
 }
 
 static short snapCur

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list