[Bf-blender-cvs] [d337c20cf9a] temp-geometry-nodes-fields-prototype: fix use after free in socket inspection

Jacques Lucke noreply at git.blender.org
Wed Aug 18 13:31:50 CEST 2021


Commit: d337c20cf9accb17dfd71a79f699c7b72918b196
Author: Jacques Lucke
Date:   Wed Aug 18 13:31:41 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rBd337c20cf9accb17dfd71a79f699c7b72918b196

fix use after free in socket inspection

For now I just evaluate constant fields immediately. The issue was that
parts of the fields was freed already when socket inspection runs.

===================================================================

M	source/blender/modifiers/intern/MOD_nodes_evaluator.cc

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 4dbc89234d1..e255922787e 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -917,27 +917,55 @@ class GeometryNodesEvaluator {
       OutputState &output_state = node_state.outputs[i];
       const DOutputSocket socket{node.context(), &socket_ref};
       bke::FieldPtr out_field = new bke::MultiFunctionField(input_fields, fn, output_param_index);
-      if (socket->typeinfo()->type == SOCK_FLOAT) {
+
+      eNodeSocketDatatype socket_data_type = (eNodeSocketDatatype)socket->typeinfo()->type;
+
+      {
+        bke::FieldInputs field_inputs = out_field->prepare_inputs();
+        if (field_inputs.tot_inputs() == 0) {
+          bke::FieldOutput field_output = out_field->evaluate(IndexRange(1), field_inputs);
+          const fn::GVArray &varray = field_output.varray_ref();
+          BUFFER_FOR_CPP_TYPE_VALUE(varray.type(), buffer);
+          varray.get_to_uninitialized(0, buffer);
+          if (socket_data_type == SOCK_FLOAT) {
+            out_field = new bke::ConstantField<float>(*(float *)buffer);
+          }
+          else if (socket_data_type == SOCK_VECTOR) {
+            out_field = new bke::ConstantField<float3>(*(float3 *)buffer);
+          }
+          else if (socket_data_type == SOCK_BOOLEAN) {
+            out_field = new bke::ConstantField<bool>(*(bool *)buffer);
+          }
+          else if (socket_data_type == SOCK_RGBA) {
+            out_field = new bke::ConstantField<ColorGeometry4f>(*(ColorGeometry4f *)buffer);
+          }
+          else if (socket_data_type == SOCK_INT) {
+            out_field = new bke::ConstantField<int>(*(int *)buffer);
+          }
+        }
+      }
+
+      if (socket_data_type == SOCK_FLOAT) {
         bke::FieldRef<float> *field_ref =
             allocator.construct<bke::FieldRef<float>>(out_field).release();
         this->forward_output(socket, field_ref);
       }
-      else if (socket->typeinfo()->type == SOCK_VECTOR) {
+      else if (socket_data_type == SOCK_VECTOR) {
         bke::FieldRef<float3> *field_ref =
             allocator.construct<bke::FieldRef<float3>>(out_field).release();
         this->forward_output(socket, field_ref);
       }
-      else if (socket->typeinfo()->type == SOCK_BOOLEAN) {
+      else if (socket_data_type == SOCK_BOOLEAN) {
         bke::FieldRef<bool> *field_ref =
             allocator.construct<bke::FieldRef<bool>>(out_field).release();
         this->forward_output(socket, field_ref);
       }
-      else if (socket->typeinfo()->type == SOCK_RGBA) {
+      else if (socket_data_type == SOCK_RGBA) {
         bke::FieldRef<blender::ColorGeometry4f> *field_ref =
             allocator.construct<bke::FieldRef<blender::ColorGeometry4f>>(out_field).release();
         this->forward_output(socket, field_ref);
       }
-      else if (socket->typeinfo()->type == SOCK_INT) {
+      else if (socket_data_type == SOCK_INT) {
         bke::FieldRef<int> *field_ref =
             allocator.construct<bke::FieldRef<int>>(out_field).release();
         this->forward_output(socket, field_ref);



More information about the Bf-blender-cvs mailing list