diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-07-16 13:34:43 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-07-16 17:20:03 -0700 |
| commit | e7a639967e91c8408ae281a97966e3dd67dd5565 (patch) | |
| tree | cc9d058fda2a7d64d836c6f35c2d7bd94b154d63 /lib/std/Io/Reader.zig | |
| parent | 9222d201d76d5b134d9014480520f649140563c3 (diff) | |
| download | zig-e7a639967e91c8408ae281a97966e3dd67dd5565.tar.gz zig-e7a639967e91c8408ae281a97966e3dd67dd5565.zip | |
std.Io.Reader: fix appendRemaining
it calls readVec which is a higher level function than was expected in
the previous implementation
Diffstat (limited to 'lib/std/Io/Reader.zig')
| -rw-r--r-- | lib/std/Io/Reader.zig | 26 |
1 files changed, 5 insertions, 21 deletions
diff --git a/lib/std/Io/Reader.zig b/lib/std/Io/Reader.zig index e569c36773..38e0c6dc30 100644 --- a/lib/std/Io/Reader.zig +++ b/lib/std/Io/Reader.zig @@ -246,34 +246,18 @@ pub fn appendRemaining( limit: Limit, ) LimitedAllocError!void { assert(r.buffer.len != 0); // Needed to detect limit exceeded without losing data. - const buffer = r.buffer; - const buffer_contents = buffer[r.seek..r.end]; - const copy_len = limit.minInt(buffer_contents.len); - try list.ensureUnusedCapacity(gpa, copy_len); - @memcpy(list.unusedCapacitySlice()[0..copy_len], buffer[0..copy_len]); - list.items.len += copy_len; - r.seek += copy_len; - if (copy_len == buffer_contents.len) { - r.seek = 0; - r.end = 0; - } - var remaining = limit.subtract(copy_len).?; - while (true) { - try list.ensureUnusedCapacity(gpa, 1); + var remaining = limit; + while (remaining.nonzero()) { + try list.ensureUnusedCapacity(gpa, r.bufferedLen() + 1); const dest = remaining.slice(list.unusedCapacitySlice()); - const additional_buffer: []u8 = if (@intFromEnum(remaining) == dest.len) buffer else &.{}; - const n = readVec(r, &.{ dest, additional_buffer }) catch |err| switch (err) { + const n = readVecLimit(r, &.{dest}, .unlimited) catch |err| switch (err) { error.EndOfStream => break, error.ReadFailed => return error.ReadFailed, }; - if (n > dest.len) { - r.end = n - dest.len; - list.items.len += dest.len; - return error.StreamTooLong; - } list.items.len += n; remaining = remaining.subtract(n).?; } + if (r.bufferedLen() != 0) return error.StreamTooLong; } /// Writes bytes from the internally tracked stream position to `data`. |
