Fix #116025: Uninitialized value when versioning old node trees

Usually we expect new DNA values do be zeroed when we add them. But the
conversion to the interface format for 4.0 didn't clear the memory, so
behavior was different when updating old files. Fix that by using
`calloc` instead of `malloc`.
This commit is contained in:
Hans Goudey 2023-12-13 11:24:39 -05:00
parent 7e4c2b2649
commit 65252564ee
1 changed files with 15 additions and 17 deletions

View File

@ -1395,39 +1395,37 @@ static void version_geometry_nodes_use_rotation_socket(bNodeTree &ntree)
static bNodeTreeInterfaceItem *legacy_socket_move_to_interface(bNodeSocket &legacy_socket,
const eNodeSocketInOut in_out)
{
bNodeTreeInterfaceItem *new_item = static_cast<bNodeTreeInterfaceItem *>(
MEM_mallocN(sizeof(bNodeTreeInterfaceSocket), __func__));
new_item->item_type = NODE_INTERFACE_SOCKET;
bNodeTreeInterfaceSocket &new_socket = *reinterpret_cast<bNodeTreeInterfaceSocket *>(new_item);
bNodeTreeInterfaceSocket *new_socket = MEM_cnew<bNodeTreeInterfaceSocket>(__func__);
new_socket->item.item_type = NODE_INTERFACE_SOCKET;
/* Move reusable data. */
new_socket.name = BLI_strdup(legacy_socket.name);
new_socket.identifier = BLI_strdup(legacy_socket.identifier);
new_socket.description = BLI_strdup(legacy_socket.description);
new_socket.socket_type = BLI_strdup(legacy_socket.idname);
new_socket.flag = (in_out == SOCK_IN ? NODE_INTERFACE_SOCKET_INPUT :
NODE_INTERFACE_SOCKET_OUTPUT);
new_socket->name = BLI_strdup(legacy_socket.name);
new_socket->identifier = BLI_strdup(legacy_socket.identifier);
new_socket->description = BLI_strdup(legacy_socket.description);
new_socket->socket_type = BLI_strdup(legacy_socket.idname);
new_socket->flag = (in_out == SOCK_IN ? NODE_INTERFACE_SOCKET_INPUT :
NODE_INTERFACE_SOCKET_OUTPUT);
SET_FLAG_FROM_TEST(
new_socket.flag, legacy_socket.flag & SOCK_HIDE_VALUE, NODE_INTERFACE_SOCKET_HIDE_VALUE);
SET_FLAG_FROM_TEST(new_socket.flag,
new_socket->flag, legacy_socket.flag & SOCK_HIDE_VALUE, NODE_INTERFACE_SOCKET_HIDE_VALUE);
SET_FLAG_FROM_TEST(new_socket->flag,
legacy_socket.flag & SOCK_HIDE_IN_MODIFIER,
NODE_INTERFACE_SOCKET_HIDE_IN_MODIFIER);
new_socket.attribute_domain = legacy_socket.attribute_domain;
new_socket->attribute_domain = legacy_socket.attribute_domain;
/* The following data are stolen from the old data, the ownership of their memory is directly
* transferred to the new data. */
new_socket.default_attribute_name = legacy_socket.default_attribute_name;
new_socket->default_attribute_name = legacy_socket.default_attribute_name;
legacy_socket.default_attribute_name = nullptr;
new_socket.socket_data = legacy_socket.default_value;
new_socket->socket_data = legacy_socket.default_value;
legacy_socket.default_value = nullptr;
new_socket.properties = legacy_socket.prop;
new_socket->properties = legacy_socket.prop;
legacy_socket.prop = nullptr;
/* Unused data. */
MEM_delete(legacy_socket.runtime);
legacy_socket.runtime = nullptr;
return new_item;
return &new_socket->item;
}
static void versioning_convert_node_tree_socket_lists_to_interface(bNodeTree *ntree)