[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