[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44610] trunk/blender/source/blender: fix bug [#30426] crash in bmesh python api.

Campbell Barton ideasman42 at gmail.com
Fri Mar 2 19:23:24 CET 2012


Revision: 44610
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44610
Author:   campbellbarton
Date:     2012-03-02 18:23:08 +0000 (Fri, 02 Mar 2012)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2012-03-02 17:53:39 UTC (rev 44609)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2012-03-02 18:23:08 UTC (rev 44610)
@@ -154,6 +154,13 @@
 
 	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);
 }
 

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2012-03-02 17:53:39 UTC (rev 44609)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c	2012-03-02 18:23:08 UTC (rev 44610)
@@ -2040,12 +2040,15 @@
 {
 	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 @@
 	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);




More information about the Bf-blender-cvs mailing list