From e041d0fc02b1f0f8e9bc4436accb1ced374aeadd Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Tue, 3 Nov 2020 00:01:24 +0100 Subject: Fix memory leaks in sculpt mode trimming tools BKE_mesh_free() seems to not free the meshes correctly, so using BKE_id_free() instead. The looptri array was also not freed. Reviewed By: sergey Differential Revision: https://developer.blender.org/D9426 --- source/blender/editors/sculpt_paint/paint_mask.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'source/blender/editors/sculpt_paint') diff --git a/source/blender/editors/sculpt_paint/paint_mask.c b/source/blender/editors/sculpt_paint/paint_mask.c index cc0d20089b4..aec58eb8191 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.c +++ b/source/blender/editors/sculpt_paint/paint_mask.c @@ -42,6 +42,7 @@ #include "BKE_brush.h" #include "BKE_ccg.h" #include "BKE_context.h" +#include "BKE_lib_id.h" #include "BKE_mesh.h" #include "BKE_multires.h" #include "BKE_paint.h" @@ -906,7 +907,7 @@ static void sculpt_gesture_trim_normals_update(SculptGestureContext *sgcontext) }), trim_mesh); BM_mesh_free(bm); - BKE_mesh_free(trim_mesh); + BKE_id_free(NULL, trim_mesh); trim_operation->mesh = result; } @@ -1075,7 +1076,7 @@ static void sculpt_gesture_trim_geometry_generate(SculptGestureContext *sgcontex static void sculpt_gesture_trim_geometry_free(SculptGestureContext *sgcontext) { SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; - BKE_mesh_free(trim_operation->mesh); + BKE_id_free(NULL, trim_operation->mesh); MEM_freeN(trim_operation->true_mesh_co); } @@ -1086,7 +1087,6 @@ static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data)) static void sculpt_gesture_apply_trim(SculptGestureContext *sgcontext) { - SculptGestureTrimOperation *trim_operation = (SculptGestureTrimOperation *)sgcontext->operation; Mesh *sculpt_mesh = BKE_mesh_from_object(sgcontext->vc.obact); Mesh *trim_mesh = trim_operation->mesh; @@ -1164,12 +1164,17 @@ static void sculpt_gesture_apply_trim(SculptGestureContext *sgcontext) BM_mesh_boolean(bm, looptris, tottri, bm_face_isect_pair, NULL, 2, true, boolean_mode); } - Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL, sculpt_mesh); + MEM_freeN(looptris); + + Mesh *result = BKE_mesh_from_bmesh_nomain(bm, + (&(struct BMeshToMeshParams){ + .calc_object_remap = false, + }), + sculpt_mesh); BM_mesh_free(bm); result->runtime.cd_dirty_vert |= CD_MASK_NORMAL; - - BKE_mesh_nomain_to_mesh(result, sculpt_mesh, sgcontext->vc.obact, &CD_MASK_MESH, true); - BKE_mesh_free(result); + BKE_mesh_nomain_to_mesh( + result, sgcontext->vc.obact->data, sgcontext->vc.obact, &CD_MASK_MESH, true); } static void sculpt_gesture_trim_begin(bContext *C, SculptGestureContext *sgcontext) -- cgit v1.2.3