From 912df7df354fd6c814b5d7c45ac44f494a5fb5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Thu, 4 Nov 2021 00:22:50 +0100 Subject: [PATCH] Fix quadratic runtime when linebreaking strings without newlines The problem was that every line would iterate from current line start position to the end of the string, looking for a newline to break on, leading to accidentally quadratic runtime. With this change, the code only ever searches up to the current line's length and not more. Credit to @jorgenpt for the fix suggestion. Closes #2315 --- src/catch2/internal/catch_textflow.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/catch2/internal/catch_textflow.cpp b/src/catch2/internal/catch_textflow.cpp index f8b8e7f4..993e1622 100644 --- a/src/catch2/internal/catch_textflow.cpp +++ b/src/catch2/internal/catch_textflow.cpp @@ -6,6 +6,8 @@ // SPDX-License-Identifier: BSL-1.0 #include + +#include #include #include @@ -41,13 +43,16 @@ namespace Catch { void Column::const_iterator::calcLength() { m_addHyphen = false; - const auto maxLineLength = m_column.m_width - indentSize(); m_parsedTo = m_lineStart; + std::string const& current_line = m_column.m_string; if ( current_line[m_lineStart] == '\n' ) { ++m_parsedTo; } - while ( m_parsedTo < current_line.size() && + + const auto maxLineLength = m_column.m_width - indentSize(); + const auto maxParseTo = std::min(current_line.size(), m_lineStart + maxLineLength); + while ( m_parsedTo < maxParseTo && current_line[m_parsedTo] != '\n' ) { ++m_parsedTo; }