From d75808fdf099f637ae282d2392f17d8206c98713 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 29 Sep 2025 17:24:50 +0200 Subject: [PATCH] Fix: Node editor drawing stack use after scope Caused by a bad conversion to StringRef in 950a2bb8a3e6c9431534cf5b1639. Instead pass around StringRef since that's all that's needed by the UI code anyway. And make the argument to the node socket drawing RNA function clearer, previously it relied on the char pointer being first in StringRefNull. Pull Request: https://projects.blender.org/blender/blender/pulls/146985 --- source/blender/blenkernel/BKE_node.hh | 2 +- .../interface/templates/interface_template_node_inputs.cc | 4 ++-- source/blender/editors/space_node/drawnode.cc | 8 ++++---- source/blender/makesrna/intern/rna_node_socket.cc | 6 ++++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/source/blender/blenkernel/BKE_node.hh b/source/blender/blenkernel/BKE_node.hh index 9d63e780d1f..6186650ed66 100644 --- a/source/blender/blenkernel/BKE_node.hh +++ b/source/blender/blenkernel/BKE_node.hh @@ -167,7 +167,7 @@ struct bNodeSocketType { uiLayout *layout, PointerRNA *ptr, PointerRNA *node_ptr, - StringRefNull text) = nullptr; + StringRef text) = nullptr; void (*draw_color)(bContext *C, PointerRNA *ptr, PointerRNA *node_ptr, float *r_color) = nullptr; void (*draw_color_simple)(const bNodeSocketType *socket_type, float *r_color) = nullptr; diff --git a/source/blender/editors/interface/templates/interface_template_node_inputs.cc b/source/blender/editors/interface/templates/interface_template_node_inputs.cc index e063cdee9e7..36f42af3a7f 100644 --- a/source/blender/editors/interface/templates/interface_template_node_inputs.cc +++ b/source/blender/editors/interface/templates/interface_template_node_inputs.cc @@ -70,8 +70,8 @@ static void draw_node_input(bContext *C, PointerRNA socket_ptr = RNA_pointer_create_discrete( node_ptr->owner_id, &RNA_NodeSocket, &socket); - const StringRefNull text( - CTX_IFACE_(bke::node_socket_translation_context(socket), bke::node_socket_label(socket))); + const StringRef text = CTX_IFACE_(bke::node_socket_translation_context(socket), + bke::node_socket_label(socket)); uiLayout *row = &layout->row(true); socket.typeinfo->draw(C, row, &socket_ptr, node_ptr, text); } diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index 5feca19fc93..4756296a10a 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -83,7 +83,7 @@ static void node_socket_button_label(bContext * /*C*/, uiLayout *layout, PointerRNA * /*ptr*/, PointerRNA * /*node_ptr*/, - const StringRefNull text) + const StringRef text) { layout->label(text, ICON_NONE); } @@ -868,7 +868,7 @@ static void node_socket_undefined_draw(bContext * /*C*/, uiLayout *layout, PointerRNA * /*ptr*/, PointerRNA * /*node_ptr*/, - StringRefNull /*text*/) + StringRef /*text*/) { layout->label(IFACE_("Undefined Socket Type"), ICON_ERROR); } @@ -1071,7 +1071,7 @@ static void draw_node_socket_without_value(uiLayout *layout, } static void std_node_socket_draw( - bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *node_ptr, StringRefNull label) + bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *node_ptr, StringRef label) { bNode *node = (bNode *)node_ptr->data; bNodeSocket *sock = (bNodeSocket *)ptr->data; @@ -1086,7 +1086,7 @@ static void std_node_socket_draw( } const bool optional_label = (socket_decl && socket_decl->optional_label) || label.is_empty(); - const StringRefNull label_or_empty = optional_label ? "" : label; + const StringRef label_or_empty = optional_label ? "" : label; const bool has_gizmo = tree->runtime->gizmo_propagation ? tree->runtime->gizmo_propagation->gizmo_endpoint_sockets.contains( diff --git a/source/blender/makesrna/intern/rna_node_socket.cc b/source/blender/makesrna/intern/rna_node_socket.cc index 35d22975e70..6e80d9de2b1 100644 --- a/source/blender/makesrna/intern/rna_node_socket.cc +++ b/source/blender/makesrna/intern/rna_node_socket.cc @@ -72,7 +72,7 @@ static void rna_NodeSocket_draw(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *node_ptr, - const blender::StringRefNull text) + const blender::StringRef text) { bNodeSocket *sock = static_cast(ptr->data); ParameterList list; @@ -84,7 +84,9 @@ static void rna_NodeSocket_draw(bContext *C, RNA_parameter_set_lookup(&list, "context", &C); RNA_parameter_set_lookup(&list, "layout", &layout); RNA_parameter_set_lookup(&list, "node", node_ptr); - RNA_parameter_set_lookup(&list, "text", &text); + const std::string text_str = text; + const char *text_c_str = text_str.c_str(); + RNA_parameter_set_lookup(&list, "text", &text_c_str); sock->typeinfo->ext_socket.call(C, ptr, func, &list); RNA_parameter_list_free(&list);