EnrichedString: Fix substr segfault caused by non-formatted text

This commit is contained in:
SmallJoker 2020-01-24 20:42:26 +01:00
parent 987b2c5f37
commit 9cb3219f34
1 changed files with 16 additions and 5 deletions

View File

@ -19,7 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "enriched_string.h" #include "enriched_string.h"
#include "util/string.h" #include "util/string.h"
#include "debug.h"
#include "log.h" #include "log.h"
using namespace irr::video; using namespace irr::video;
EnrichedString::EnrichedString() EnrichedString::EnrichedString()
@ -28,10 +30,12 @@ EnrichedString::EnrichedString()
} }
EnrichedString::EnrichedString(const std::wstring &string, EnrichedString::EnrichedString(const std::wstring &string,
const std::vector<SColor> &colors): const std::vector<SColor> &colors)
m_string(string), {
m_colors(colors) clear();
{} m_string = string;
m_colors = colors;
}
EnrichedString::EnrichedString(const std::wstring &s, const SColor &color) EnrichedString::EnrichedString(const std::wstring &s, const SColor &color)
{ {
@ -52,6 +56,7 @@ void EnrichedString::clear()
m_has_background = false; m_has_background = false;
m_default_length = 0; m_default_length = 0;
m_default_color = irr::video::SColor(255, 255, 255, 255); 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) 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), m_string.substr(pos, len),
std::vector<SColor>(m_colors.begin() + pos, m_colors.begin() + 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) 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); str.setDefaultColor(m_default_color);
return str; return str;
} }
@ -199,6 +208,8 @@ void EnrichedString::setDefaultColor(const irr::video::SColor &color)
void EnrichedString::updateDefaultColor() void EnrichedString::updateDefaultColor()
{ {
sanity_check(m_default_length <= m_colors.size());
for (size_t i = 0; i < m_default_length; ++i) for (size_t i = 0; i < m_default_length; ++i)
m_colors[i] = m_default_color; m_colors[i] = m_default_color;
} }