authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 14:34:21-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 19:26:12-07:00
log0294e91451ba8fb06a40cbd0d3da80e2792f5923
tree027509af55d2d1bf5a64d2431cf2a537ba4d8958
parent264bd7053edb948d0f96525b54b859c0422e12a2

std.Io.Reader: fix readVec at end


1 files changed, 15 insertions(+), 1 deletions(-)

lib/std/Io/Reader.zig+15-1
......@@ -406,7 +406,10 @@ pub fn readVec(r: *Reader, data: [][]u8) Error!usize {
406406 r.seek = seek;
407407 data[i] = buf[copy_len..];
408408 defer data[i] = buf;
409 return n + try r.vtable.readVec(r, data[i..]);
409 return n + (r.vtable.readVec(r, data[i..]) catch |err| switch (err) {
410 error.EndOfStream => if (n == 0) return error.EndOfStream else 0,
411 error.ReadFailed => return error.ReadFailed,
412 });
410413 }
411414 const n = seek - r.seek;
412415 r.seek = seek;
......@@ -1657,6 +1660,17 @@ test "expected error.EndOfStream" {
16571660 try std.testing.expectError(error.EndOfStream, r.take(3));
16581661}
16591662
1663test "readVec at end" {
1664 var reader_buffer: [8]u8 = "abcd1234".*;
1665 var reader: testing.Reader = .init(&reader_buffer, &.{});
1666 reader.interface.end = reader_buffer.len;
1667
1668 var out: [16]u8 = undefined;
1669 var vecs: [1][]u8 = .{&out};
1670 try testing.expectEqual(8, try reader.interface.readVec(&vecs));
1671 try testing.expectEqualStrings("abcd1234", vecs[0][0..8]);
1672}
1673
16601674fn endingStream(r: *Reader, w: *Writer, limit: Limit) StreamError!usize {
16611675 _ = r;
16621676 _ = w;