forked from bartvdbraak/blender
Fix for crash when duplicating image or render layer nodes.
These nodes use cached buffers (in sock->cache), which need to be cleared when duplicating the node, otherwise the buffer will be freed twice.
This commit is contained in:
parent
68693b4532
commit
7db716599c
@ -398,6 +398,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
|
|||||||
sock->stack_index= 0;
|
sock->stack_index= 0;
|
||||||
|
|
||||||
sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
|
sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
|
||||||
|
|
||||||
|
/* XXX some compositor node (e.g. image, render layers) still store
|
||||||
|
* some persistent buffer data here, need to clear this to avoid dangling pointers.
|
||||||
|
*/
|
||||||
|
sock->cache = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_duplicatelist(&nnode->outputs, &node->outputs);
|
BLI_duplicatelist(&nnode->outputs, &node->outputs);
|
||||||
@ -407,6 +412,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
|
|||||||
sock->stack_index= 0;
|
sock->stack_index= 0;
|
||||||
|
|
||||||
sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
|
sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL);
|
||||||
|
|
||||||
|
/* XXX some compositor node (e.g. image, render layers) still store
|
||||||
|
* some persistent buffer data here, need to clear this to avoid dangling pointers.
|
||||||
|
*/
|
||||||
|
sock->cache = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* don't increase node->id users, freenode doesn't decrement either */
|
/* don't increase node->id users, freenode doesn't decrement either */
|
||||||
|
@ -362,7 +362,7 @@ static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd)
|
|||||||
int a;
|
int a;
|
||||||
node = nodeexec->node;
|
node = nodeexec->node;
|
||||||
|
|
||||||
node_get_stack(node, thd->stack, nsin, nsout);
|
node_get_stack(node, exec->stack, nsin, nsout);
|
||||||
|
|
||||||
/* test the outputs */
|
/* test the outputs */
|
||||||
/* skip value-only nodes (should be in type!) */
|
/* skip value-only nodes (should be in type!) */
|
||||||
@ -428,7 +428,7 @@ static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd)
|
|||||||
node = nodeexec->node;
|
node = nodeexec->node;
|
||||||
if(node->need_exec==0 && node_only_value(node)) {
|
if(node->need_exec==0 && node_only_value(node)) {
|
||||||
if(node->typeinfo->execfunc) {
|
if(node->typeinfo->execfunc) {
|
||||||
node_get_stack(node, thd->stack, nsin, nsout);
|
node_get_stack(node, exec->stack, nsin, nsout);
|
||||||
node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
|
node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user