From e9c935caa0b58d31cad19ca237a55fac8a2c6410 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 2 Mar 2012 18:23:08 +0000 Subject: fix bug [#30426] crash in bmesh python api. if blender freed the BMesh before python was finished (on exit editmode for eg), python would attempt to access the bmesh to clear python pointers in it. --- source/blender/python/bmesh/bmesh_py_types.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'source/blender/python') diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c index 1145fbbd452..65bce912963 100644 --- a/source/blender/python/bmesh/bmesh_py_types.c +++ b/source/blender/python/bmesh/bmesh_py_types.c @@ -2040,12 +2040,15 @@ static void bpy_bmesh_dealloc(BPy_BMesh *self) { BMesh *bm = self->bm; - BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR); - BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR); - BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR); - BM_data_layer_free(bm, &bm->ldata, CD_BM_ELEM_PYPTR); + /* have have been freed by bmesh */ + if (bm) { + BM_data_layer_free(bm, &bm->vdata, CD_BM_ELEM_PYPTR); + BM_data_layer_free(bm, &bm->edata, CD_BM_ELEM_PYPTR); + BM_data_layer_free(bm, &bm->pdata, CD_BM_ELEM_PYPTR); + BM_data_layer_free(bm, &bm->ldata, CD_BM_ELEM_PYPTR); - bm->py_handle = NULL; + bm->py_handle = NULL; + } PyObject_DEL(self); } @@ -2384,6 +2387,7 @@ PyObject *BPy_BMesh_CreatePyObject(BMesh *bm) else { self = PyObject_New(BPy_BMesh, &BPy_BMesh_Type); self->bm = bm; + bm->py_handle = self; /* point back */ BM_data_layer_add(bm, &bm->vdata, CD_BM_ELEM_PYPTR); BM_data_layer_add(bm, &bm->edata, CD_BM_ELEM_PYPTR); -- cgit v1.2.3