[Bf-blender-cvs] [be3da5e9db2] compositor-cryptomatte-workflow: Fix ASAN error used after free.
Jeroen Bakker
noreply at git.blender.org
Mon Mar 15 09:59:36 CET 2021
Commit: be3da5e9db2c260f45ff6c245cd3907c3466f69b
Author: Jeroen Bakker
Date: Mon Mar 15 09:59:01 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rBbe3da5e9db2c260f45ff6c245cd3907c3466f69b
Fix ASAN error used after free.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/compositor/nodes/COM_CryptomatteNode.cc
M source/blender/editors/interface/interface_eyedropper_color.c
M source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 99629db659d..42022cce5a5 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1288,7 +1288,8 @@ void ntreeCompositCryptomatteSyncFromAdd(bNode *node);
void ntreeCompositCryptomatteSyncFromRemove(bNode *node);
bNodeSocket *ntreeCompositCryptomatteAddSocket(bNodeTree *ntree, bNode *node);
int ntreeCompositCryptomatteRemoveSocket(bNodeTree *ntree, bNode *node);
-const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node);
+void ntreeCompositCryptomatteLayerPrefix(const bNode *node, char *r_prefix, size_t prefix_len);
+
/* Update the runtime layer names with the cryptomatte layer names of the references
* render layer or image. */
void ntreeCompositCryptomatteUpdateLayerNames(bNode *node);
diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.cc b/source/blender/compositor/nodes/COM_CryptomatteNode.cc
index 01ed67c3bf2..577acb59eca 100644
--- a/source/blender/compositor/nodes/COM_CryptomatteNode.cc
+++ b/source/blender/compositor/nodes/COM_CryptomatteNode.cc
@@ -75,6 +75,12 @@ void CryptomatteBaseNode::convertToOperations(NodeConverter &converter,
/** \name Cryptomatte V2
* \{ */
+static std::string prefix_from_node(const bNode &node)
+{
+ char prefix[MAX_NAME];
+ ntreeCompositCryptomatteLayerPrefix(&node, prefix, sizeof(prefix));
+ return std::string(prefix, BLI_strnlen(prefix, sizeof(prefix)));
+}
void CryptomatteNode::input_operations_from_render_source(
const CompositorContext &context,
@@ -95,7 +101,7 @@ void CryptomatteNode::input_operations_from_render_source(
}
const short cryptomatte_layer_id = 0;
- const std::string prefix = ntreeCompositCryptomatteLayerPrefix(&node);
+ const std::string prefix = prefix_from_node(node);
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
if (render_layer) {
@@ -158,7 +164,7 @@ void CryptomatteNode::input_operations_from_image_source(
}
}
- const std::string prefix = ntreeCompositCryptomatteLayerPrefix(&node);
+ const std::string prefix = prefix_from_node(node);
LISTBASE_FOREACH (RenderLayer *, render_layer, &image->rr->layers) {
LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) {
const std::string combined_name =
diff --git a/source/blender/editors/interface/interface_eyedropper_color.c b/source/blender/editors/interface/interface_eyedropper_color.c
index c4391d57129..a94f1b8efb1 100644
--- a/source/blender/editors/interface/interface_eyedropper_color.c
+++ b/source/blender/editors/interface/interface_eyedropper_color.c
@@ -229,7 +229,10 @@ static bool eyedropper_cryptomatte_sample_fl(
}
bool success = false;
- const char *prefix = ntreeCompositCryptomatteLayerPrefix(node);
+ /* TODO(jbakker): Migrate this file to cc and use std::string as return param. */
+ char prefix[MAX_NAME + 1];
+ ntreeCompositCryptomatteLayerPrefix(node, prefix, sizeof(prefix) - 1);
+ prefix[MAX_NAME] = '\0';
if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) {
Scene *scene = (Scene *)node->id;
diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index b2e78e1c897..d81076c2fa6 100644
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@ -190,31 +190,30 @@ void ntreeCompositCryptomatteUpdateLayerNames(bNode *node)
}
}
-const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node)
+void ntreeCompositCryptomatteLayerPrefix(const bNode *node, char *r_prefix, size_t prefix_len)
{
BLI_assert(node->type == CMP_NODE_CRYPTOMATTE);
NodeCryptomatte *node_cryptomatte = (NodeCryptomatte *)node->storage;
blender::bke::cryptomatte::CryptomatteSessionPtr session = cryptomatte_init_from_node(
*node, 0, false);
- std::optional<std::string> first_layer_name = std::nullopt;
+ std::string first_layer_name;
if (session) {
for (blender::StringRef layer_name :
blender::bke::cryptomatte::BKE_cryptomatte_layer_names_get(*session)) {
- if (!first_layer_name.has_value()) {
+ if (first_layer_name.empty()) {
first_layer_name = layer_name;
}
if (layer_name == node_cryptomatte->layer_name) {
- return node_cryptomatte->layer_name;
+ BLI_strncpy(r_prefix, node_cryptomatte->layer_name, prefix_len);
+ return;
}
}
}
- if (!first_layer_name.has_value()) {
- return "";
- }
- return first_layer_name.value().c_str();
+ const char *cstr = first_layer_name.c_str();
+ BLI_strncpy(r_prefix, cstr, prefix_len);
}
static void node_init_cryptomatte(bNodeTree *UNUSED(ntree), bNode *node)
More information about the Bf-blender-cvs
mailing list