From d9e26c25160746a57c5a91dcb842389a8f71f761 Mon Sep 17 00:00:00 2001 From: Evgeny Pestov Date: Mon, 14 Feb 2022 17:17:13 +0700 Subject: [PATCH] Use std::invalid_argument in Utf8CharSizeAt --- src/common/stringutils.cpp | 7 ++++++- src/graphics/engine/text.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/common/stringutils.cpp b/src/common/stringutils.cpp index bc11fee4..a7d30f6a 100644 --- a/src/common/stringutils.cpp +++ b/src/common/stringutils.cpp @@ -184,7 +184,12 @@ int StrUtils::Utf8CharSizeAt(const std::string &str, unsigned int pos) if((c & 0b1111'1000) == 0b1111'0000) return 4; - return 1; + // Invalid char - unexpected continuation byte + if (isUtf8ContinuationByte(c)) + throw std::invalid_argument("Unexpected UTF-8 continuation byte"); + + // (c & 0b1111'1000) == 0b1111'1000 is true here + throw std::invalid_argument("Byte value has no sense in UTF-8"); } std::size_t StrUtils::Utf8StringLength(const std::string &str) diff --git a/src/graphics/engine/text.cpp b/src/graphics/engine/text.cpp index 315a3fbb..7b6cb8a3 100644 --- a/src/graphics/engine/text.cpp +++ b/src/graphics/engine/text.cpp @@ -937,7 +937,14 @@ int CText::GetCharSizeAt(Gfx::FontType font, const std::string& text, unsigned i } else { - len = StrUtils::Utf8CharSizeAt(text, index); + try + { + len = StrUtils::Utf8CharSizeAt(text, index); + } + catch (std::invalid_argument &e) + { + len = 1; + } } return len; }