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.

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to