[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59413] trunk/blender/source/blender/bmesh /operators/bmo_bisect_plane.c: _another_ fix for recently added bisect operator, looping over mixed geometry could read freed memory when vertices were removed .

Campbell Barton ideasman42 at gmail.com
Fri Aug 23 13:11:59 CEST 2013


Revision: 59413
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59413
Author:   campbellbarton
Date:     2013-08-23 11:11:59 +0000 (Fri, 23 Aug 2013)
Log Message:
-----------
_another_ fix for recently added bisect operator, looping over mixed geometry could read freed memory when vertices were removed.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_bisect_plane.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bisect_plane.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bisect_plane.c	2013-08-23 11:10:46 UTC (rev 59412)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bisect_plane.c	2013-08-23 11:11:59 UTC (rev 59413)
@@ -26,6 +26,8 @@
  * Wrapper around #BM_mesh_bisect_plane
  */
 
+#include "MEM_guardedalloc.h"
+
 #include "BLI_utildefines.h"
 #include "BLI_math.h"
 
@@ -70,23 +72,39 @@
 
 
 	if (clear_outer || clear_inner) {
+		/* Use an array of vertices because 'geom' contains both vers and edges that may use them.
+		 * Removing a vert may remove and edge which is later checked by BMO_ITER.
+		 * over-alloc the total possible vert count */
+		const int vert_arr_max = min_ii(bm->totvert, BMO_slot_buffer_count(op->slots_in, "geom"));
+		BMVert **vert_arr = MEM_mallocN(sizeof(*vert_arr) * (size_t)vert_arr_max, __func__);
 		BMOIter siter;
 		BMVert *v;
 		float plane_inner[4];
 		float plane_outer[4];
 
+		STACK_DECLARE(vert_arr);
+
 		copy_v3_v3(plane_outer, plane);
 		copy_v3_v3(plane_inner, plane);
 		plane_outer[3] = plane[3] - dist;
 		plane_inner[3] = plane[3] + dist;
 
+		STACK_INIT(vert_arr);
+
 		BMO_ITER (v, &siter, op->slots_in, "geom", BM_VERT) {
 			if ((clear_outer && plane_point_side_v3(plane_outer, v->co) > 0.0f) ||
 			    (clear_inner && plane_point_side_v3(plane_inner, v->co) < 0.0f))
 			{
-				BM_vert_kill(bm, v);
+				STACK_PUSH(vert_arr, v);
 			}
 		}
+
+		while ((v = STACK_POP(vert_arr))) {
+			BM_vert_kill(bm, v);
+		}
+
+		STACK_FREE(vert_arr);
+		MEM_freeN(vert_arr);
 	}
 
 	BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "geom.out", BM_ALL_NOLOOP, ELE_NEW | ELE_INPUT);




More information about the Bf-blender-cvs mailing list