From 4934a04d8a3a90aa16b42eb913a7d1b647d15cf3 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Fri, 2 May 2025 04:43:25 -0400 Subject: [PATCH] Fix race condition crash when setting element text, bump version to 1.2.0-rc3 --- src/main/main.cpp | 2 +- src/ui/elements/ui_element.cpp | 30 ++++++++---------------------- src/ui/elements/ui_element.h | 1 + 3 files changed, 10 insertions(+), 23 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index a7981a9..3c2f321 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -48,7 +48,7 @@ #include "../../lib/rt64/src/contrib/stb/stb_image.h" -const std::string version_string = "1.2.0-rc2"; +const std::string version_string = "1.2.0-rc3"; template void exit_error(const char* str, Ts ...args) { diff --git a/src/ui/elements/ui_element.cpp b/src/ui/elements/ui_element.cpp index b1525f2..c2bd990 100644 --- a/src/ui/elements/ui_element.cpp +++ b/src/ui/elements/ui_element.cpp @@ -355,30 +355,16 @@ bool Element::is_enabled() const { return enabled && !disabled_from_parent; } -// Adapted from RmlUi's `EncodeRml`. -std::string escape_rml(std::string_view string) -{ - std::string result; - result.reserve(string.size()); - for (char c : string) - { - switch (c) - { - case '<': result += "<"; break; - case '>': result += ">"; break; - case '&': result += "&"; break; - case '"': result += """; break; - case '\n': result += "
"; break; - default: result += c; break; - } - } - return result; -} - void Element::set_text(std::string_view text) { if (can_set_text) { - // Escape the string into Rml to prevent element injection. - base->SetInnerRML(escape_rml(text)); + if (text_element == nullptr) { + Rml::ElementPtr text_element_owning = get_current_context().get_document()->CreateTextNode(std::string{text}); + text_element = rmlui_static_cast(text_element_owning.get()); + base->AppendChild(std::move(text_element_owning)); + } + else { + text_element->SetText(std::string{text}); + } } else { assert(false && "Attempted to set text of an element that cannot have its text set."); diff --git a/src/ui/elements/ui_element.h b/src/ui/elements/ui_element.h index 6e2ce16..551a7ec 100644 --- a/src/ui/elements/ui_element.h +++ b/src/ui/elements/ui_element.h @@ -25,6 +25,7 @@ class Element : public Style, public Rml::EventListener { friend class ContextId; // To allow ContextId to call the handle_event method directly. private: Rml::Element *base = nullptr; + Rml::ElementText *text_element = nullptr; Rml::ElementPtr base_owning = {}; uint32_t events_enabled = 0; std::vector