From fd2718f82ab70d99186f43845e4291515efb66a5 Mon Sep 17 00:00:00 2001 From: glowsquid Date: Mon, 6 Apr 2026 02:03:11 +0200 Subject: [PATCH] fix positional reader discarding (#31593) closes #30151 closes #30126 Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31593 Reviewed-by: Ryan Liptak Co-authored-by: glowsquid Co-committed-by: glowsquid --- lib/std/Io/File/Reader.zig | 4 +++- lib/std/Io/test.zig | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/std/Io/File/Reader.zig b/lib/std/Io/File/Reader.zig index effd000df8..fb4c478695 100644 --- a/lib/std/Io/File/Reader.zig +++ b/lib/std/Io/File/Reader.zig @@ -309,7 +309,9 @@ fn discard(io_reader: *Io.Reader, limit: Io.Limit) Io.Reader.Error!usize { return 0; }; const logical_pos = logicalPos(r); - const delta = @min(@intFromEnum(limit), size - logical_pos); + const bytes_remaining = size - logical_pos; + if (bytes_remaining == 0) return error.EndOfStream; + const delta = @min(@intFromEnum(limit), bytes_remaining); setLogicalPos(r, logical_pos + delta); return delta; }, diff --git a/lib/std/Io/test.zig b/lib/std/Io/test.zig index 73931f9ea9..bd6b433d05 100644 --- a/lib/std/Io/test.zig +++ b/lib/std/Io/test.zig @@ -85,6 +85,28 @@ test "File.Writer.seekTo" { try expect(fw.logicalPos() == 1234); } +test "file discard" { + var tmp = tmpDir(.{}); + defer tmp.cleanup(); + + const io = testing.io; + + const tmp_file_name = "temp_test_file.txt"; + var file = try tmp.dir.createFile(io, tmp_file_name, .{ .read = true }); + defer file.close(io); + + var fw = file.writerStreaming(io, &.{}); + + try fw.interface.writeAll("test"); + + var fr = file.reader(io, &.{}); + const r = &fr.interface; + + try std.testing.expectEqual(error.EndOfStream, r.discardAll(1024)); + try fr.seekTo(0); + try std.testing.expectEqual(4, fr.interface.discardRemaining()); +} + test "File.setLength" { const io = testing.io;