summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorSmallJoker <mk939@ymail.com>2020-01-24 20:42:26 +0100
committerSmallJoker <mk939@ymail.com>2020-01-24 21:06:30 +0100
commit9cb3219f34be983e1b84a62a64c25e137d587365 (patch)
tree890a31bb558703f5ef644fa4c3d5cb02a9623387 /src/util
parent987b2c5f372ea30e90f3d83dd9e76c2286a14a34 (diff)
downloadminetest-9cb3219f34be983e1b84a62a64c25e137d587365.tar.gz
minetest-9cb3219f34be983e1b84a62a64c25e137d587365.tar.bz2
minetest-9cb3219f34be983e1b84a62a64c25e137d587365.zip
EnrichedString: Fix substr segfault caused by non-formatted text
Diffstat (limited to 'src/util')
-rw-r--r--src/util/enriched_string.cpp21
1 files 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<SColor> &colors):
- m_string(string),
- m_colors(colors)
-{}
+ const std::vector<SColor> &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<SColor>(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;
}