From 2d9661790db30eb169d07d36b485943c598253b9 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 7 Jun 2022 20:18:20 +0200 Subject: fix: prevent statusline heap buffer overflow --- src/engine/components/statusline.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'src/engine/components/statusline.cpp') diff --git a/src/engine/components/statusline.cpp b/src/engine/components/statusline.cpp index ae0f3fa..df16e83 100644 --- a/src/engine/components/statusline.cpp +++ b/src/engine/components/statusline.cpp @@ -49,12 +49,17 @@ void StatusLine::set_status( auto pos = Vector2({.x = section_start + start, .y = 0}); - for (const auto &character : status) - { - _component_matrix->set(pos, character); + const auto column_cnt = static_cast(_component_matrix->get_column_cnt()); - pos += Vector2::right(); - } + const auto section_length = _section_lengths[section]; + + const auto status_len = static_cast(status.length()); + + _matrix_write_string( + pos, + status_len <= section_length + ? status + : status.substr(0U, static_cast(section_length))); set_need_render(true); } @@ -64,6 +69,20 @@ void StatusLine::set_section_length(StatusLineSection section, int32_t length) n _section_lengths[section] = length; } +void StatusLine::_matrix_write_string( + const Vector2 &position, + const std::string_view &str) noexcept +{ + auto working_pos = position; + + for (const auto &character : str) + { + _component_matrix->set(working_pos, character); + + working_pos += Vector2::right(); + } +} + auto StatusLine::_get_section_start_x(StatusLineSection section) const noexcept -> int32_t { int32_t section_start = 0; -- cgit v1.2.3-18-g5258