aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDS <ds.desour@proton.me>2023-03-11 17:46:49 +0100
committerGitHub <noreply@github.com>2023-03-11 17:46:49 +0100
commitb1ed0ef721d1ef59e7266fbf975f4d2e33b44041 (patch)
tree3e7eea444fb734e4a08fd9d14153ca94125b5cce
parent1aeb0280df208a32f22b637f0aa6e9b01c451a31 (diff)
downloadminetest-b1ed0ef721d1ef59e7266fbf975f4d2e33b44041.tar.xz
Fix ChatPrompt crash in very narrow windows (#13305)
In very narrow windows, `m_cols` can be small (i.e. 0). Hence, `m_view <= m_line.size() + 1 - m_cols` does not guarantee `m_view <= m_line.size()`. `std::string::substr(pos, npos)` requires `pos <= size()`.
-rw-r--r--src/chat.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/chat.cpp b/src/chat.cpp
index b021a3e6b..ddce6cd75 100644
--- a/src/chat.cpp
+++ b/src/chat.cpp
@@ -229,8 +229,8 @@ void ChatBuffer::scrollBottom()
m_scroll = getBottomScrollPos();
}
-u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
- std::vector<ChatFormattedLine>& destination) const
+u32 ChatBuffer::formatChatLine(const ChatLine &line, u32 cols,
+ std::vector<ChatFormattedLine> &destination) const
{
u32 num_added = 0;
std::vector<ChatFormattedFragment> next_frags;
@@ -269,7 +269,10 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
// Very long names
hanging_indentation = 2;
}
- //EnrichedString line_text(line.text);
+ // If there are no columns remaining after the indentation (window is very
+ // narrow), we can't write anything
+ if (hanging_indentation >= cols)
+ return 0;
next_line.first = true;
// Set/use forced newline after the last frag in each line
@@ -670,7 +673,11 @@ void ChatPrompt::reformat(u32 cols)
std::wstring ChatPrompt::getVisiblePortion() const
{
- return m_prompt + getLineRef().substr(m_view, m_cols);
+ const std::wstring &line_ref = getLineRef();
+ if ((size_t)m_view >= line_ref.size())
+ return m_prompt;
+ else
+ return m_prompt + line_ref.substr(m_view, m_cols);
}
s32 ChatPrompt::getVisibleCursorPosition() const