Skip to content

Commit 0294e91

Browse files
committed
std.Io.Reader: fix readVec at end
1 parent 264bd70 commit 0294e91

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

lib/std/Io/Reader.zig

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

1663+
test "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+
16601674
fn endingStream(r: *Reader, w: *Writer, limit: Limit) StreamError!usize {
16611675
_ = r;
16621676
_ = w;

0 commit comments

Comments
 (0)