[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51678] trunk/blender/source/blender: Fix #32982, Segault when trying to show a node material.

Lukas Toenne lukas.toenne at googlemail.com
Sat Oct 27 13:56:24 CEST 2012


Revision: 51678
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51678
Author:   lukastoenne
Date:     2012-10-27 11:56:21 +0000 (Sat, 27 Oct 2012)
Log Message:
-----------
Fix #32982, Segault when trying to show a node material.

This was caused by incomplete pointer mapping of the node->internal_links list in r51630, my bad. In intermediate revisions this could lead to corrupted .blend data. This patch adds a do_versions check to remove such bad links. The correct internal_links list will get restored on node update.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51630

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-10-27 11:18:54 UTC (rev 51677)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-10-27 11:56:21 UTC (rev 51678)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION         264
-#define BLENDER_SUBVERSION      5
+#define BLENDER_SUBVERSION      6
 
 /* 262 was the last editmesh release but it has compatibility code for bmesh data */
 #define BLENDER_MINVERSION      262

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-27 11:18:54 UTC (rev 51677)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-10-27 11:56:21 UTC (rev 51678)
@@ -2414,6 +2414,12 @@
 		link_list(fd, &node->outputs);
 		
 		link_list(fd, &node->internal_links);
+		for (link = node->internal_links.first; link; link = link->next) {
+			link->fromnode = newdataadr(fd, link->fromnode);
+			link->fromsock = newdataadr(fd, link->fromsock);
+			link->tonode = newdataadr(fd, link->tonode);
+			link->tosock = newdataadr(fd, link->tosock);
+		}
 		
 		if (node->type == CMP_NODE_MOVIEDISTORTION) {
 			node->storage = newmclipadr(fd, node->storage);
@@ -7117,6 +7123,21 @@
 	}
 }
 
+static void do_version_node_fix_internal_links_264(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+{
+	bNode *node;
+	bNodeLink *link, *nextlink;
+	
+	for (node = ntree->nodes.first; node; node = node->next) {
+		for (link = node->internal_links.first; link; link = nextlink) {
+			nextlink = link->next;
+			if (!link->fromnode || !link->fromsock || !link->tonode || !link->tosock) {
+				BLI_remlink(&node->internal_links, link);
+			}
+		}
+	}
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
 	/* WATCH IT!!!: pointers from libdata have not been converted */
@@ -8204,6 +8225,28 @@
 		}
 	}
 
+	if (main->versionfile < 264 || (main->versionfile == 264 && main->subversionfile < 6)) {
+		/* Fix for bug #32982, internal_links list could get corrupted from r51630 onward.
+		 * Simply remove bad internal_links lists to avoid NULL pointers.
+		 */
+		bNodeTreeType *ntreetype;
+		bNodeTree *ntree;
+		
+		ntreetype = ntreeGetType(NTREE_COMPOSIT);
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_node_fix_internal_links_264);
+		ntreetype = ntreeGetType(NTREE_SHADER);
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_node_fix_internal_links_264);
+		ntreetype = ntreeGetType(NTREE_TEXTURE);
+		if (ntreetype && ntreetype->foreach_nodetree)
+			ntreetype->foreach_nodetree(main, NULL, do_version_node_fix_internal_links_264);
+		
+		for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+			do_version_node_fix_internal_links_264(NULL, NULL, ntree);
+		
+	}
+
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
 	/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
 




More information about the Bf-blender-cvs mailing list