diff --git a/src/host/readDataCooked.cpp b/src/host/readDataCooked.cpp index 14377379690..6ea80796f7e 100644 --- a/src/host/readDataCooked.cpp +++ b/src/host/readDataCooked.cpp @@ -1035,7 +1035,7 @@ void COOKED_READ_DATA::SavePendingInput(const size_t index, const bool multiline { // ProcessAliases() is supposed to end each line with \r\n. If it doesn't we might as well fail-fast. const auto firstLineEnd = input.find(UNICODE_LINEFEED) + 1; - input = input.substr(0, firstLineEnd); + input = input.substr(0, std::min(input.size(), firstLineEnd)); } } } @@ -1050,7 +1050,7 @@ void COOKED_READ_DATA::SavePendingInput(const size_t index, const bool multiline const auto inputSizeAfter = input.size(); const auto amountConsumed = inputSizeBefore - inputSizeAfter; input = { _backupLimit, _bytesRead / sizeof(wchar_t) }; - input = input.substr(amountConsumed); + input = input.substr(std::min(input.size(), amountConsumed)); GetInputReadHandleData()->SaveMultilinePendingInput(input); } else if (!input.empty()) diff --git a/src/host/stream.cpp b/src/host/stream.cpp index d3e9ea5aab3..5ab812bda9a 100644 --- a/src/host/stream.cpp +++ b/src/host/stream.cpp @@ -295,7 +295,7 @@ try if (readHandleState.IsMultilineInput()) { const auto firstLineEnd = input.find(UNICODE_LINEFEED) + 1; - input = input.substr(0, firstLineEnd); + input = input.substr(0, std::min(input.size(), firstLineEnd)); } const auto inputSizeBefore = input.size(); @@ -308,7 +308,7 @@ try { const auto inputSizeAfter = input.size(); const auto amountConsumed = inputSizeBefore - inputSizeAfter; - input = pending.substr(amountConsumed); + input = pending.substr(std::min(pending.size(), amountConsumed)); } if (input.empty())