aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Io/Reader.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-07-16 13:34:43 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-07-16 17:20:03 -0700
commite7a639967e91c8408ae281a97966e3dd67dd5565 (patch)
treecc9d058fda2a7d64d836c6f35c2d7bd94b154d63 /lib/std/Io/Reader.zig
parent9222d201d76d5b134d9014480520f649140563c3 (diff)
downloadzig-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.zig26
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`.