From efd227eca2e2013b4e540ab2ba44664668a5253b Mon Sep 17 00:00:00 2001 From: Ryan Liptak Date: Wed, 19 Aug 2026 17:42:45 -0700 Subject: [PATCH] File.Reader.seekBy: Fix erroneously tossing the buffer in streaming mode The discard already handles updating the state, so the toss was redundant in the best case and would erroneously drop data in the worst case. Closes #36568 --- lib/std/Io/File/Reader.zig | 1 - lib/std/fs/test.zig | 12 +++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/std/Io/File/Reader.zig b/lib/std/Io/File/Reader.zig index ca442bf54a1d0653e20e7afff3a682880eae90a5..35cf676f4ae97dfa1391b9d90649348665500f73 100644 --- a/lib/std/Io/File/Reader.zig +++ b/lib/std/Io/File/Reader.zig @@ -154,7 +154,6 @@ pub fn seekBy(r: *Reader, offset: i64) SeekError!void { return err; }; } - r.interface.tossBuffered(); }, .failure => return r.seek_err.?, } diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig index 981bc75d442a3688f43224d4dfe278c03ea3f5a8..9104a229b85c0839324deb34e536282e34a7baf9 100644 --- a/lib/std/fs/test.zig +++ b/lib/std/fs/test.zig @@ -2409,13 +2409,19 @@ test "seekBy" { try tmp_dir.dir.writeFile(io, .{ .sub_path = "blah.txt", .data = "let's test seekBy" }); const f = try tmp_dir.dir.openFile(io, "blah.txt", .{ .mode = .read_only }); defer f.close(io); - var reader = f.readerStreaming(io, &.{}); + var buf: [10]u8 = undefined; + var reader = f.readerStreaming(io, &buf); + // Seek without any buffered data + try reader.seekBy(2); + + // Seek when the buffered data is sufficient to satisfy the seek amount + try reader.interface.fill(2); try reader.seekBy(2); var buffer: [20]u8 = undefined; const n = try reader.interface.readSliceShort(&buffer); - try expectEqual(15, n); - try expectEqualStrings("t's test seekBy", buffer[0..15]); + try expectEqual(13, n); + try expectEqualStrings("s test seekBy", buffer[0..n]); } test "seekTo flushes buffered data" { -- 2.54.0