zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Mlib/std/Io/Reader/Limited.zig | 66+++---------------------------------------------------------------
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);