[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60743] trunk/blender/source/blender: Fix for crash from double-freeing in nodes:

Lukas Toenne lukas.toenne at googlemail.com
Mon Oct 14 10:03:55 CEST 2013


Revision: 60743
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60743
Author:   lukastoenne
Date:     2013-10-14 08:03:55 +0000 (Mon, 14 Oct 2013)
Log Message:
-----------
Fix for crash from double-freeing in nodes:
The way node groups check for localized trees in the ntreeFreeTree_ex function does not work. When the main library is freed on exit it also frees genuine node groups trees (which is correct), but then
node groups referencing these trees will not find them in the library and interpret that as a localized group, attempting to free them a second time ... Nicer solution is to just use a special flag on
localized node trees so we can clearly distinguish them from genuine trees in main.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2013-10-14 08:03:53 UTC (rev 60742)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2013-10-14 08:03:55 UTC (rev 60743)
@@ -1672,8 +1672,8 @@
 	for (node = ntree->nodes.first; node; node = node->next) {
 		if (node->type == NODE_GROUP && node->id) {
 			bNodeTree *ngroup = (bNodeTree *)node->id;
-			if (BLI_findindex(&G.main->nodetree, ngroup) == -1) {
-				/* ntree is not in library, i.e. localized node group: free it */
+			if (ngroup->flag & NTREE_IS_LOCALIZED) {
+				/* ntree is a localized copy: free it */
 				ntreeFreeTree_ex(ngroup, false);
 				MEM_freeN(ngroup);
 			}
@@ -1960,6 +1960,7 @@
 		 * Note: previews are not copied here.
 		 */
 		ltree = ntreeCopyTree_internal(ntree, NULL, FALSE, FALSE, FALSE);
+		ltree->flag |= NTREE_IS_LOCALIZED;
 		
 		for (node = ltree->nodes.first; node; node = node->next) {
 			if (node->type == NODE_GROUP && node->id) {

Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_node_types.h	2013-10-14 08:03:53 UTC (rev 60742)
+++ trunk/blender/source/blender/makesdna/DNA_node_types.h	2013-10-14 08:03:55 UTC (rev 60743)
@@ -402,6 +402,7 @@
 #define NTREE_TWO_PASS				4	/* two pass */
 #define NTREE_COM_GROUPNODE_BUFFER	8	/* use groupnode buffers */
 #define NTREE_VIEWER_BORDER			16	/* use a border for viewer nodes */
+#define NTREE_IS_LOCALIZED			32	/* tree is localized copy, free when deleting node groups */
 
 /* XXX not nice, but needed as a temporary flags
  * for group updates after library linking.




More information about the Bf-blender-cvs mailing list