[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