[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50579] trunk/blender/source/blender: fix for 2 crashes freeing masks

Campbell Barton ideasman42 at gmail.com
Fri Sep 14 03:15:11 CEST 2012


Revision: 50579
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50579
Author:   campbellbarton
Date:     2012-09-14 01:15:08 +0000 (Fri, 14 Sep 2012)
Log Message:
-----------
fix for 2 crashes freeing masks
- freeing a mask from RNA BKE_libblock_free() twice on the mask.
- loading a new blend file would only free the mask and not unlink it from nodes - it would access freed memory.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mask.h
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/blenkernel/intern/mask.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/compositor/operations/COM_MaskOperation.cpp
    trunk/blender/source/blender/makesrna/intern/rna_main_api.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mask.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mask.h	2012-09-13 23:39:09 UTC (rev 50578)
+++ trunk/blender/source/blender/blenkernel/BKE_mask.h	2012-09-14 01:15:08 UTC (rev 50579)
@@ -102,8 +102,8 @@
 struct Mask *BKE_mask_copy_nolib(struct Mask *mask);
 struct Mask *BKE_mask_copy(struct Mask *mask);
 
-void BKE_mask_free(struct Mask *mask);
-void BKE_mask_unlink(struct Main *bmain, struct Mask *mask);
+void BKE_mask_free_nolib(struct Mask *mask);
+void BKE_mask_free(struct Main *bmain, struct Mask *mask);
 
 void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2]);
 void BKE_mask_coord_from_movieclip(struct MovieClip *clip, struct MovieClipUser *user, float r_co[2], const float co[2]);

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2012-09-13 23:39:09 UTC (rev 50578)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2012-09-14 01:15:08 UTC (rev 50579)
@@ -800,6 +800,7 @@
 /* used in headerbuttons.c image.c mesh.c screen.c sound.c and library.c */
 void BKE_libblock_free(ListBase *lb, void *idv)
 {
+	Main *bmain = G.main;  /* should eventually be an arg */
 	ID *id = idv;
 
 #ifdef WITH_PYTHON
@@ -899,7 +900,7 @@
 			BKE_movieclip_free((MovieClip *)id);
 			break;
 		case ID_MSK:
-			BKE_mask_free((Mask *)id);
+			BKE_mask_free(bmain, (Mask *)id);
 			break;
 	}
 
@@ -911,7 +912,7 @@
 	BLI_remlink(lb, id);
 
 	/* this ID may be a driver target! */
-	BKE_animdata_main_cb(G.main, animdata_dtar_clear_cb, (void *)id);
+	BKE_animdata_main_cb(bmain, animdata_dtar_clear_cb, (void *)id);
 
 	MEM_freeN(id);
 }
@@ -946,9 +947,52 @@
 		ID *id;
 		
 		while ( (id = lb->first) ) {
+#if 1
 			BKE_libblock_free(lb, id);
+#else
+			/* errors freeing ID's can be hard to track down,
+			 * enable this so valgrind will give the line number in its error log */
+			switch (a) {
+				case   0: BKE_libblock_free(lb, id); break;
+				case   1: BKE_libblock_free(lb, id); break;
+				case   2: BKE_libblock_free(lb, id); break;
+				case   3: BKE_libblock_free(lb, id); break;
+				case   4: BKE_libblock_free(lb, id); break;
+				case   5: BKE_libblock_free(lb, id); break;
+				case   6: BKE_libblock_free(lb, id); break;
+				case   7: BKE_libblock_free(lb, id); break;
+				case   8: BKE_libblock_free(lb, id); break;
+				case   9: BKE_libblock_free(lb, id); break;
+				case  10: BKE_libblock_free(lb, id); break;
+				case  11: BKE_libblock_free(lb, id); break;
+				case  12: BKE_libblock_free(lb, id); break;
+				case  13: BKE_libblock_free(lb, id); break;
+				case  14: BKE_libblock_free(lb, id); break;
+				case  15: BKE_libblock_free(lb, id); break;
+				case  16: BKE_libblock_free(lb, id); break;
+				case  17: BKE_libblock_free(lb, id); break;
+				case  18: BKE_libblock_free(lb, id); break;
+				case  19: BKE_libblock_free(lb, id); break;
+				case  20: BKE_libblock_free(lb, id); break;
+				case  21: BKE_libblock_free(lb, id); break;
+				case  22: BKE_libblock_free(lb, id); break;
+				case  23: BKE_libblock_free(lb, id); break;
+				case  24: BKE_libblock_free(lb, id); break;
+				case  25: BKE_libblock_free(lb, id); break;
+				case  26: BKE_libblock_free(lb, id); break;
+				case  27: BKE_libblock_free(lb, id); break;
+				case  28: BKE_libblock_free(lb, id); break;
+				case  29: BKE_libblock_free(lb, id); break;
+				case  30: BKE_libblock_free(lb, id); break;
+				case  31: BKE_libblock_free(lb, id); break;
+				case  32: BKE_libblock_free(lb, id); break;
+				default:
+					BLI_assert(0);
+			}
+#endif
 		}
 	}
+	a = set_listbasepointers(mainvar, lbarray);
 
 	MEM_freeN(mainvar);
 }

Modified: trunk/blender/source/blender/blenkernel/intern/mask.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask.c	2012-09-13 23:39:09 UTC (rev 50578)
+++ trunk/blender/source/blender/blenkernel/intern/mask.c	2012-09-14 01:15:08 UTC (rev 50579)
@@ -910,7 +910,8 @@
 	}
 }
 
-void BKE_mask_free(Mask *mask)
+/** free for temp copy, but don't manage unlinking from other pointers */
+void BKE_mask_free_nolib(Mask *mask)
 {
 	BKE_mask_layer_free_list(&mask->masklayers);
 }
@@ -928,7 +929,7 @@
 	}
 }
 
-void BKE_mask_unlink(Main *bmain, Mask *mask)
+void BKE_mask_free(Main *bmain, Mask *mask)
 {
 	bScreen *scr;
 	ScrArea *area;
@@ -991,7 +992,8 @@
 		treetype->foreach_nodetree(bmain, (void *)mask, &ntree_unlink_mask_cb);
 	}
 
-	BKE_libblock_free(&bmain->mask, mask);
+	/* free mask data */
+	BKE_mask_layer_free_list(&mask->masklayers);
 }
 
 void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2])

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-09-13 23:39:09 UTC (rev 50578)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2012-09-14 01:15:08 UTC (rev 50579)
@@ -2157,7 +2157,7 @@
 
 		BKE_maskrasterize_handle_init(mr_handle, mask_temp, context.rectx, context.recty, TRUE, TRUE, TRUE);
 
-		BKE_mask_free(mask_temp);
+		BKE_mask_free_nolib(mask_temp);
 		MEM_freeN(mask_temp);
 
 		BKE_maskrasterize_buffer(mr_handle, context.rectx, context.recty, maskbuf);

Modified: trunk/blender/source/blender/compositor/operations/COM_MaskOperation.cpp
===================================================================
--- trunk/blender/source/blender/compositor/operations/COM_MaskOperation.cpp	2012-09-13 23:39:09 UTC (rev 50578)
+++ trunk/blender/source/blender/compositor/operations/COM_MaskOperation.cpp	2012-09-14 01:15:08 UTC (rev 50579)
@@ -93,7 +93,7 @@
 				frame_iter += frame_step;
 			}
 
-			BKE_mask_free(mask_temp);
+			BKE_mask_free_nolib(mask_temp);
 			MEM_freeN(mask_temp);
 		}
 	}

Modified: trunk/blender/source/blender/makesrna/intern/rna_main_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2012-09-13 23:39:09 UTC (rev 50578)
+++ trunk/blender/source/blender/makesrna/intern/rna_main_api.c	2012-09-14 01:15:08 UTC (rev 50579)
@@ -556,7 +556,7 @@
 
 void rna_Main_masks_remove(Main *bmain, Mask *mask)
 {
-	BKE_mask_unlink(bmain, mask);
+	BKE_mask_free(bmain, mask);
 	BKE_libblock_free(&bmain->mask, mask);
 	/* XXX python now has invalid pointer? */
 }




More information about the Bf-blender-cvs mailing list