commit b824ca8494f24b92fb5f84eea64807678315eae3 (tree)
parent 2c0aa1c6f551a38ee359065cce09eadb3b34cc2d
Author: Andrew Kelley <andrew@ziglang.org>
Date: Tue, 7 Oct 2025 14:33:54 -0700
Revert "Fix infinite loop in Reader.Limited"
This reverts commit 27aba2d776caf59bb6569934626af587fdba9c75.
I'd like to review this contribution more carefully, particularly with
the alternate implementation that is also open as a pull request
(#25109).
Reopens #25093
Diffstat:
1 file changed, 3 insertions(+), 63 deletions(-)
diff --git a/lib/std/Io/Reader/Limited.zig b/lib/std/Io/Reader/Limited.zig
@@ -28,11 +28,9 @@ pub fn init(reader: *Reader, limit: Limit, buffer: []u8) Limited {
fn stream(r: *Reader, w: *Writer, limit: Limit) Reader.StreamError!usize {
const l: *Limited = @fieldParentPtr("interface", r);
const combined_limit = limit.min(l.remaining);
- if (combined_limit.nonzero()) {
- const n = try l.unlimited.stream(w, combined_limit);
- l.remaining = l.remaining.subtract(n).?;
- return n;
- } else return error.EndOfStream;
+ const n = try l.unlimited.stream(w, combined_limit);
+ l.remaining = l.remaining.subtract(n).?;
+ return n;
}
test stream {
@@ -51,64 +49,6 @@ test stream {
try std.testing.expectEqualStrings("test", result_buf[0..streamed]);
}
-test "readSliceAll from infinite source" {
- const InfSource = struct {
- reader: std.Io.Reader,
-
- pub fn init(buffer: []u8) @This() {
- return @This(){
- .reader = .{
- .vtable = &.{
- .stream = streamA,
- },
- .buffer = buffer,
- .seek = 0,
- .end = 0,
- },
- };
- }
-
- fn streamA(io_reader: *std.Io.Reader, w: *std.Io.Writer, limit: std.Io.Limit) std.Io.Reader.StreamError!usize {
- _ = io_reader;
-
- std.debug.assert(limit.nonzero());
-
- const n_bytes_remaining = limit.minInt(2);
- for (0..n_bytes_remaining) |_| {
- try w.writeByte('A');
- }
- return n_bytes_remaining;
- }
- };
-
- // Exact size
- {
- var inf_buf: [10]u8 = undefined;
- var inf_stream = InfSource.init(&inf_buf);
-
- var limit_buf: [2]u8 = undefined;
- var limited: std.Io.Reader.Limited = .init(&inf_stream.reader, .limited(2), &limit_buf);
- const limited_reader = &limited.interface;
-
- var out_buffer: [2]u8 = undefined;
- try std.testing.expectEqual({}, limited_reader.readSliceAll(&out_buffer));
- try std.testing.expectEqualStrings("AA", &out_buffer);
- }
-
- // Too large
- {
- var inf_buf: [10]u8 = undefined;
- var inf_stream = InfSource.init(&inf_buf);
-
- var limit_buf: [2]u8 = undefined;
- var limited: std.Io.Reader.Limited = .init(&inf_stream.reader, .limited(2), &limit_buf);
- const limited_reader = &limited.interface;
-
- var out_buffer: [8]u8 = undefined;
- try std.testing.expectError(error.EndOfStream, limited_reader.readSliceAll(&out_buffer));
- }
-}
-
fn discard(r: *Reader, limit: Limit) Reader.Error!usize {
const l: *Limited = @fieldParentPtr("interface", r);
const combined_limit = limit.min(l.remaining);