diff options
author | HampusM <hampus@hampusmat.com> | 2022-06-07 20:18:20 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-06-13 17:57:01 +0200 |
commit | 2d9661790db30eb169d07d36b485943c598253b9 (patch) | |
tree | acb95c260e07a9ee945906216e4d2388a91bbebf /src/engine/components/statusline.cpp | |
parent | 8805b1fe27344e8086cebabf869b7a02d2376f05 (diff) |
fix: prevent statusline heap buffer overflow
Diffstat (limited to 'src/engine/components/statusline.cpp')
-rw-r--r-- | src/engine/components/statusline.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
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<int32_t>(_component_matrix->get_column_cnt()); - pos += Vector2::right(); - } + const auto section_length = _section_lengths[section]; + + const auto status_len = static_cast<int32_t>(status.length()); + + _matrix_write_string( + pos, + status_len <= section_length + ? status + : status.substr(0U, static_cast<uint32_t>(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; |