authorgravatar for hi@whatisaph.onewhatisaphone <hi@whatisaph.one> 2025-09-01 10:23:49-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-08 17:24:38-07:00
logb9f8b6ef0649f4bbbd9e24c51ec65a91a8bc5e67
tree8a0d6090c3e3d16747b57d3660df44c854d62633
parente5a55f61441944042a9e47de51ea8f2523edb03e

Fix Reader.Limited end of stream conditions


1 files changed, 44 insertions(+), 0 deletions(-)

lib/std/Io/Reader/Limited.zig+44
......@@ -27,6 +27,7 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
2727
2828fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
2929 const l: *Limited = @fieldParentPtr("interface", r);
30 if (l.remaining == .nothing) return error.EndOfStream;
3031 const combined_limit = limit.min(l.remaining);
3132 const n = try l.unlimited.stream(w, combined_limit);
3233 l.remaining = l.remaining.subtract(n).?;
......@@ -51,8 +52,51 @@ test stream {
5152
5253fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
5354 const l: *Limited = @fieldParentPtr("interface", r);
55 if (l.remaining == .nothing) return error.EndOfStream;
5456 const combined_limit = limit.min(l.remaining);
5557 const n = try l.unlimited.discard(combined_limit);
5658 l.remaining = l.remaining.subtract(n).?;
5759 return n;
5860}
61
62test "end of stream, read, hit limit exactly" {
63 var f: Reader = .fixed("i'm dying");
64 var l = f.limited(.limited(4), &.{});
65 const r = &l.interface;
66
67 var buf: [2]u8 = undefined;
68 try r.readSliceAll(&buf);
69 try r.readSliceAll(&buf);
70 try std.testing.expectError(error.EndOfStream, l.interface.readSliceAll(&buf));
71}
72
73test "end of stream, read, hit limit after partial read" {
74 var f: Reader = .fixed("i'm dying");
75 var l = f.limited(.limited(5), &.{});
76 const r = &l.interface;
77
78 var buf: [2]u8 = undefined;
79 try r.readSliceAll(&buf);
80 try r.readSliceAll(&buf);
81 try std.testing.expectError(error.EndOfStream, l.interface.readSliceAll(&buf));
82}
83
84test "end of stream, discard, hit limit exactly" {
85 var f: Reader = .fixed("i'm dying");
86 var l = f.limited(.limited(4), &.{});
87 const r = &l.interface;
88
89 try r.discardAll(2);
90 try r.discardAll(2);
91 try std.testing.expectError(error.EndOfStream, l.interface.discardAll(2));
92}
93
94test "end of stream, discard, hit limit after partial read" {
95 var f: Reader = .fixed("i'm dying");
96 var l = f.limited(.limited(5), &.{});
97 const r = &l.interface;
98
99 try r.discardAll(2);
100 try r.discardAll(2);
101 try std.testing.expectError(error.EndOfStream, l.interface.discardAll(2));
102}