diff options
| author | DS <ds.desour@proton.me> | 2023-03-11 17:46:49 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-11 17:46:49 +0100 |
| commit | b1ed0ef721d1ef59e7266fbf975f4d2e33b44041 (patch) | |
| tree | 3e7eea444fb734e4a08fd9d14153ca94125b5cce /src | |
| parent | 1aeb0280df208a32f22b637f0aa6e9b01c451a31 (diff) | |
| download | minetest-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()`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/chat.cpp | 15 |
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 |
