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 {...@@ -154,7 +154,6 @@ pub fn seekBy(r: *Reader, offset: i64) SeekError!void {
154 return err;154 return err;
155 };155 };
156 }156 }
157 r.interface.tossBuffered();
158 },157 },
159 .failure => return r.seek_err.?,158 .failure => return r.seek_err.?,
160 }159 }
lib/std/fs/test.zig+9-3
...@@ -2409,13 +2409,19 @@ test "seekBy" {...@@ -2409,13 +2409,19 @@ test "seekBy" {
2409 try tmp_dir.dir.writeFile(io, .{ .sub_path = "blah.txt", .data = "let's test seekBy" });2409 try tmp_dir.dir.writeFile(io, .{ .sub_path = "blah.txt", .data = "let's test seekBy" });
2410 const f = try tmp_dir.dir.openFile(io, "blah.txt", .{ .mode = .read_only });2410 const f = try tmp_dir.dir.openFile(io, "blah.txt", .{ .mode = .read_only });
2411 defer f.close(io);2411 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);
2413 try reader.seekBy(2);2419 try reader.seekBy(2);
24142420
2415 var buffer: [20]u8 = undefined;2421 var buffer: [20]u8 = undefined;
2416 const n = try reader.interface.readSliceShort(&buffer);2422 const n = try reader.interface.readSliceShort(&buffer);
2417 try expectEqual(15, n);2423 try expectEqual(13, n);
2418 try expectEqualStrings("t's test seekBy", buffer[0..15]);2424 try expectEqualStrings("s test seekBy", buffer[0..n]);
2419}2425}
24202426
2421test "seekTo flushes buffered data" {2427test "seekTo flushes buffered data" {