Fix #9899 integer overflow in string repeat

We could end up overflowing if we print out something that's a multiple of the
chunk size, which would then finish printing in the chunk-printing, but not
break out early.

(cherry picked from commit 6325b3662de122b571e33b7121cfc9d172d483bc)
This commit is contained in:
Henrik Hørlück Berg 2023-07-17 14:53:03 +02:00 committed by Fabian Boehm
parent a573d13cf0
commit a7c8e0cdfb
2 changed files with 8 additions and 1 deletions

View File

@ -1541,7 +1541,7 @@ static int string_repeat(parser_t &parser, io_streams_t &streams, int argc, cons
wcstring chunk;
chunk.reserve(std::min(chunk_size + w.length(), max));
for (size_t i = max; i > 0; i -= w.length()) {
for (size_t i = max; i > 0;) {
// Build up the chunk.
if (i >= w.length()) {
chunk.append(w);
@ -1549,6 +1549,9 @@ static int string_repeat(parser_t &parser, io_streams_t &streams, int argc, cons
chunk.append(w.substr(0, i));
break;
}
i -= w.length();
if (chunk.length() >= chunk_size) {
// We hit the chunk size, write it repeatedly until we can't anymore.
streams.out.append(chunk);

View File

@ -530,6 +530,10 @@ string repeat -n 17 a | string length
string repeat -m 5 (string repeat -n 500000 aaaaaaaaaaaaaaaaaa) | string length
# CHECK: 5
# might cause integer overflow
string repeat -n 2999 \n | count
# CHECK: 3000
# Test equivalent matches with/without the --entire, --regex, and --invert flags.
string match -e x abc dxf xyz jkx x z
or echo exit 1