[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60997] trunk/blender/source/blender: Fix #37192, Rendered preview causes crash when deleting a material node in shader node editor .

Lukas Toenne lukas.toenne at googlemail.com
Tue Oct 29 18:46:01 CET 2013


Revision: 60997
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60997
Author:   lukastoenne
Date:     2013-10-29 17:46:01 +0000 (Tue, 29 Oct 2013)
Log Message:
-----------
Fix #37192, Rendered preview causes crash when deleting a material node in shader node editor. The 'free' callback for node execution data was accessed from the node->typeinfo, but this pointer can
become invalid because the render database is not immediately freed after the job finishes. To avoid access to dangling node pointers, store the function callback in the exec data itself. The node
pointer must not be accessed in the free function (wasn't used before either), these functions are purely for the execution data.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/nodes/intern/node_exec.c
    trunk/blender/source/blender/nodes/intern/node_exec.h
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_common.c
    trunk/blender/source/blender/nodes/texture/nodes/node_texture_common.c

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2013-10-29 17:14:43 UTC (rev 60996)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2013-10-29 17:46:01 UTC (rev 60997)
@@ -132,7 +132,7 @@
 } bNodeSocketType;
 
 typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context, struct bNode *node, bNodeInstanceKey key);
-typedef void (*NodeFreeExecFunction)(struct bNode *node, void *nodedata);
+typedef void (*NodeFreeExecFunction)(void *nodedata);
 typedef void (*NodeExecFunction)(void *data, int thread, struct bNode *, struct bNodeExecData *execdata, struct bNodeStack **in, struct bNodeStack **out);
 typedef int (*NodeGPUExecFunction)(struct GPUMaterial *mat, struct bNode *node, struct bNodeExecData *execdata, struct GPUNodeStack *in, struct GPUNodeStack *out);
 

Modified: trunk/blender/source/blender/nodes/intern/node_exec.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/node_exec.c	2013-10-29 17:14:43 UTC (rev 60996)
+++ trunk/blender/source/blender/nodes/intern/node_exec.c	2013-10-29 17:46:01 UTC (rev 60997)
@@ -207,6 +207,7 @@
 	/* prepare all nodes for execution */
 	for (n = 0, nodeexec = exec->nodeexec; n < totnodes; ++n, ++nodeexec) {
 		node = nodeexec->node = nodelist[n];
+		nodeexec->freeexecfunc = node->typeinfo->freeexecfunc;
 		
 		/* tag inputs */
 		for (sock = node->inputs.first; sock; sock = sock->next) {
@@ -245,9 +246,8 @@
 		MEM_freeN(exec->stack);
 	
 	for (n = 0, nodeexec = exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) {
-		if (nodeexec->node->typeinfo)
-			if (nodeexec->node->typeinfo->freeexecfunc)
-				nodeexec->node->typeinfo->freeexecfunc(nodeexec->node, nodeexec->data.data);
+		if (nodeexec->freeexecfunc)
+			nodeexec->freeexecfunc(nodeexec->data.data);
 	}
 	
 	if (exec->nodeexec)

Modified: trunk/blender/source/blender/nodes/intern/node_exec.h
===================================================================
--- trunk/blender/source/blender/nodes/intern/node_exec.h	2013-10-29 17:14:43 UTC (rev 60996)
+++ trunk/blender/source/blender/nodes/intern/node_exec.h	2013-10-29 17:46:01 UTC (rev 60997)
@@ -51,6 +51,8 @@
 typedef struct bNodeExec {
 	struct bNode *node;				/* backpointer to node */
 	bNodeExecData data;
+	
+	NodeFreeExecFunction freeexecfunc; /* free function, stored in exec itself to avoid dangling node pointer access */
 } bNodeExec;
 
 /* Execution Data for each instance of node tree execution */

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_common.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_common.c	2013-10-29 17:14:43 UTC (rev 60996)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_common.c	2013-10-29 17:46:01 UTC (rev 60997)
@@ -85,7 +85,7 @@
 	return exec;
 }
 
-static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+static void group_freeexec(void *nodedata)
 {
 	bNodeTreeExec *gexec = (bNodeTreeExec *)nodedata;
 	

Modified: trunk/blender/source/blender/nodes/texture/nodes/node_texture_common.c
===================================================================
--- trunk/blender/source/blender/nodes/texture/nodes/node_texture_common.c	2013-10-29 17:14:43 UTC (rev 60996)
+++ trunk/blender/source/blender/nodes/texture/nodes/node_texture_common.c	2013-10-29 17:46:01 UTC (rev 60997)
@@ -72,7 +72,7 @@
 	return exec;
 }
 
-static void group_freeexec(bNode *UNUSED(node), void *nodedata)
+static void group_freeexec(void *nodedata)
 {
 	bNodeTreeExec *gexec = (bNodeTreeExec *)nodedata;
 	




More information about the Bf-blender-cvs mailing list