From a7e18ee945ecb6b73bd0745fd26d275ef94a3e10 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 22 Oct 2024 12:46:40 +1100 Subject: [PATCH] Fix #129167: Operator search can hang for some operator names RNA label & description truncation could cause invalid UTF8 which caused BLI_string_search to hang. Resolve by ensuring truncation of RNA descriptions & labels never truncates a multi-byte sequences. The issue with BLI_string_search would still be good to resolve but can be handled separately. --- source/blender/makesrna/intern/rna_ui.cc | 4 ++-- source/blender/makesrna/intern/rna_wm.cc | 9 ++++++--- source/blender/makesrna/intern/rna_wm_gizmo.cc | 12 +++++++++--- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/source/blender/makesrna/intern/rna_ui.cc b/source/blender/makesrna/intern/rna_ui.cc index b309878173d..ae852e21604 100644 --- a/source/blender/makesrna/intern/rna_ui.cc +++ b/source/blender/makesrna/intern/rna_ui.cc @@ -1328,7 +1328,7 @@ static void rna_Panel_bl_description_set(PointerRNA *ptr, const char *value) Panel *data = (Panel *)(ptr->data); char *str = (char *)data->type->description; if (!str[0]) { - BLI_strncpy(str, value, RNA_DYN_DESCR_MAX); /* utf8 already ensured */ + BLI_strncpy_utf8(str, value, RNA_DYN_DESCR_MAX); } else { BLI_assert_msg(0, "setting the bl_description on a non-builtin panel"); @@ -1340,7 +1340,7 @@ static void rna_Menu_bl_description_set(PointerRNA *ptr, const char *value) Menu *data = (Menu *)(ptr->data); char *str = (char *)data->type->description; if (!str[0]) { - BLI_strncpy(str, value, RNA_DYN_DESCR_MAX); /* utf8 already ensured */ + BLI_strncpy_utf8(str, value, RNA_DYN_DESCR_MAX); } else { BLI_assert_msg(0, "setting the bl_description on a non-builtin menu"); diff --git a/source/blender/makesrna/intern/rna_wm.cc b/source/blender/makesrna/intern/rna_wm.cc index 6dae2ffe0b7..fbcbc255d3b 100644 --- a/source/blender/makesrna/intern/rna_wm.cc +++ b/source/blender/makesrna/intern/rna_wm.cc @@ -1928,7 +1928,10 @@ static void rna_Operator_bl_idname_set(PointerRNA *ptr, const char *value) wmOperator *data = (wmOperator *)(ptr->data); char *str = (char *)data->type->idname; if (!str[0]) { - BLI_strncpy(str, value, OP_MAX_TYPENAME); /* utf8 already ensured */ + /* Calling UTF8 copy is disputable since registering ensures the value isn't truncated. + * Use a UTF8 copy to ensure truncating never causes an incomplete UTF8 sequence, + * even before registration. */ + BLI_strncpy_utf8(str, value, OP_MAX_TYPENAME); } else { BLI_assert_msg(0, "setting the bl_idname on a non-builtin operator"); @@ -1940,7 +1943,7 @@ static void rna_Operator_bl_label_set(PointerRNA *ptr, const char *value) wmOperator *data = (wmOperator *)(ptr->data); char *str = (char *)data->type->name; if (!str[0]) { - BLI_strncpy(str, value, OP_MAX_TYPENAME); /* utf8 already ensured */ + BLI_strncpy_utf8(str, value, OP_MAX_TYPENAME); } else { BLI_assert_msg(0, "setting the bl_label on a non-builtin operator"); @@ -1958,7 +1961,7 @@ static void rna_Operator_bl_label_set(PointerRNA *ptr, const char *value) wmOperator *data = (wmOperator *)(ptr->data); \ char *str = (char *)data->type->attr; \ if (str && !str[0]) { \ - BLI_strncpy(str, value, attr_maxncpy); /* utf8 already ensured */ \ + BLI_strncpy_utf8(str, value, attr_maxncpy); \ } \ else { \ BLI_assert_msg( \ diff --git a/source/blender/makesrna/intern/rna_wm_gizmo.cc b/source/blender/makesrna/intern/rna_wm_gizmo.cc index 69c391c6ccd..45330f75e4c 100644 --- a/source/blender/makesrna/intern/rna_wm_gizmo.cc +++ b/source/blender/makesrna/intern/rna_wm_gizmo.cc @@ -221,7 +221,10 @@ static void rna_Gizmo_bl_idname_set(PointerRNA *ptr, const char *value) wmGizmo *data = static_cast(ptr->data); char *str = (char *)data->type->idname; if (!str[0]) { - BLI_strncpy(str, value, MAX_NAME); /* utf8 already ensured */ + /* Calling UTF8 copy is disputable since registering ensures the value isn't truncated. + * Use a UTF8 copy to ensure truncating never causes an incomplete UTF8 sequence, + * even before registration. */ + BLI_strncpy_utf8(str, value, MAX_NAME); } else { BLI_assert_msg(0, "setting the bl_idname on a non-builtin operator"); @@ -642,7 +645,10 @@ static void rna_GizmoGroup_bl_idname_set(PointerRNA *ptr, const char *value) wmGizmoGroup *data = static_cast(ptr->data); char *str = (char *)data->type->idname; if (!str[0]) { - BLI_strncpy(str, value, MAX_NAME); /* utf8 already ensured */ + /* Calling UTF8 copy is disputable since registering ensures the value isn't truncated. + * Use a UTF8 copy to ensure truncating never causes an incomplete UTF8 sequence, + * even before registration. */ + BLI_strncpy_utf8(str, value, MAX_NAME); } else { BLI_assert_msg(0, "setting the bl_idname on a non-builtin operator"); @@ -654,7 +660,7 @@ static void rna_GizmoGroup_bl_label_set(PointerRNA *ptr, const char *value) wmGizmoGroup *data = static_cast(ptr->data); char *str = (char *)data->type->name; if (!str[0]) { - BLI_strncpy(str, value, MAX_NAME); /* utf8 already ensured */ + BLI_strncpy_utf8(str, value, MAX_NAME); } else { BLI_assert_msg(0, "setting the bl_label on a non-builtin operator");