fix bug [#30426] crash in bmesh python api.
authorCampbell Barton <ideasman42@gmail.com>
Fri, 2 Mar 2012 18:23:08 +0000 (18:23 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 2 Mar 2012 18:23:08 +0000 (18:23 +0000)
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/bmesh/intern/bmesh_mesh.c
source/blender/python/bmesh/bmesh_py_types.c

index 92ee222..944b3b4 100644 (file)
@@ -154,6 +154,13 @@ void BM_mesh_data_free(BMesh *bm)
 
        BLI_freelistN(&bm->selected);
 
+       if (bm->py_handle) {
+               extern void bpy_bm_generic_invalidate(void *self);
+
+               bpy_bm_generic_invalidate(bm->py_handle);
+               bm->py_handle = NULL;
+       }
+
        BMO_error_clear(bm);
 }
 
index 1145fbb..65bce91 100644 (file)
@@ -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);