Commit b824ca8494

Andrew Kelley <andrew@ziglang.org>
2025-10-07 23:33:54
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
1 parent 2c0aa1c
Changed files (1)
lib
std
Io
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);