authorgravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2026-08-19 17:42:45-07:00
committergravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2026-08-20 08:29:34+02:00
logefd227eca2e2013b4e540ab2ba44664668a5253b
tree9fe50c3ea6d6e86b3ddffa7508b6a96fd35b2d18
parent7988f79528e2105a83bc00b91866b639b181dd51

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

2 files changed, 9 insertions(+), 4 deletions(-)

lib/std/Io/File/Reader.zig-1
......@@ -154,7 +154,6 @@ pub fn seekBy(r: *Reader, offset: i64) SeekError!void {
154154 return err;
155155 };
156156 }
157 r.interface.tossBuffered();
158157 },
159158 .failure => return r.seek_err.?,
160159 }
lib/std/fs/test.zig+9-3
......@@ -2409,13 +2409,19 @@ test "seekBy" {
24092409 try tmp_dir.dir.writeFile(io, .{ .sub_path = "blah.txt", .data = "let's test seekBy" });
24102410 const f = try tmp_dir.dir.openFile(io, "blah.txt", .{ .mode = .read_only });
24112411 defer f.close(io);
2412 var reader = f.readerStreaming(io, &.{});
2412 var buf: [10]u8 = undefined;
2413 var reader = f.readerStreaming(io, &buf);
2414 // Seek without any buffered data
2415 try reader.seekBy(2);
2416
2417 // Seek when the buffered data is sufficient to satisfy the seek amount
2418 try reader.interface.fill(2);
24132419 try reader.seekBy(2);
24142420
24152421 var buffer: [20]u8 = undefined;
24162422 const n = try reader.interface.readSliceShort(&buffer);
2417 try expectEqual(15, n);
2418 try expectEqualStrings("t's test seekBy", buffer[0..15]);
2423 try expectEqual(13, n);
2424 try expectEqualStrings("s test seekBy", buffer[0..n]);
24192425}
24202426
24212427test "seekTo flushes buffered data" {