From 9cb3219f34be983e1b84a62a64c25e137d587365 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Fri, 24 Jan 2020 20:42:26 +0100 Subject: [PATCH] EnrichedString: Fix substr segfault caused by non-formatted text --- src/util/enriched_string.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/util/enriched_string.cpp b/src/util/enriched_string.cpp index d5f8aa661..762d094eb 100644 --- a/src/util/enriched_string.cpp +++ b/src/util/enriched_string.cpp @@ -19,7 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "enriched_string.h" #include "util/string.h" +#include "debug.h" #include "log.h" + using namespace irr::video; EnrichedString::EnrichedString() @@ -28,10 +30,12 @@ EnrichedString::EnrichedString() } EnrichedString::EnrichedString(const std::wstring &string, - const std::vector &colors): - m_string(string), - m_colors(colors) -{} + const std::vector &colors) +{ + clear(); + m_string = string; + m_colors = colors; +} EnrichedString::EnrichedString(const std::wstring &s, const SColor &color) { @@ -52,6 +56,7 @@ void EnrichedString::clear() m_has_background = false; m_default_length = 0; m_default_color = irr::video::SColor(255, 255, 255, 255); + m_background = irr::video::SColor(0, 0, 0, 0); } void EnrichedString::operator=(const wchar_t *str) @@ -170,8 +175,12 @@ EnrichedString EnrichedString::substr(size_t pos, size_t len) const m_string.substr(pos, len), std::vector(m_colors.begin() + pos, m_colors.begin() + pos + len) ); + + str.m_has_background = m_has_background; + str.m_background = m_background; + if (pos < m_default_length) - str.m_default_length = m_default_length - pos; + str.m_default_length = std::min(m_default_length - pos, str.size()); str.setDefaultColor(m_default_color); return str; } @@ -199,6 +208,8 @@ void EnrichedString::setDefaultColor(const irr::video::SColor &color) void EnrichedString::updateDefaultColor() { + sanity_check(m_default_length <= m_colors.size()); + for (size_t i = 0; i < m_default_length; ++i) m_colors[i] = m_default_color; }