Fix T38075, crash from shader node add/replace tree view template.
authorLukas Tönne <lukas.toenne@gmail.com>
Tue, 7 Jan 2014 09:54:31 +0000 (10:54 +0100)
committerLukas Tönne <lukas.toenne@gmail.com>
Tue, 7 Jan 2014 09:54:31 +0000 (10:54 +0100)
The sanity check for copying socket default value was using the socket
idname for type compatibility checks, which is too strict. Subtypes
would not be recognized as copyable, but since only the plain data type
is needed below this is all that needs to be checked.

That alone would not cause crash (just missing default value copy),
but the tree view template was messing with the default_value DNA
directly by freeing it in advance, which is not necessary and should
be left to blenkernel when freeing the node. Otherwise this would
leave the node invalid without a default_value if the copy function
bails out.

source/blender/editors/space_node/node_templates.c
source/blender/nodes/intern/node_socket.c

index b544e753965fea819293b6c91d89164913145c4e..ac0010b1d559d76354863301a49053239b700070 100644 (file)
@@ -246,10 +246,6 @@ static void node_socket_add_replace(const bContext *C, bNodeTree *ntree, bNode *
                                                nodeRemLink(ntree, link);
                                        }
 
-                                       if (sock_from->default_value) {
-                                               MEM_freeN(sock_from->default_value);
-                                               sock_from->default_value = NULL;
-                                       }
                                        node_socket_copy_default_value(sock_from, sock_prev);
                                }
                        }
index 92d403685d00cae17635059364db7156fc9f057b..a37042c9d70e46479fd4cf1f9232325b4e30e9c8 100644 (file)
@@ -273,7 +273,7 @@ void node_socket_init_default_value(bNodeSocket *sock)
 void node_socket_copy_default_value(bNodeSocket *to, bNodeSocket *from)
 {
        /* sanity check */
-       if (!STREQ(to->idname, from->idname))
+       if (to->type != from->type)
                return;
        
        /* make sure both exist */