authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-13 12:24:14-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-13 12:24:14-07:00
log5e986fef1fa5cf04f3547cc4f5a8c0f490ea1d3d
tree88119d0e1a5696bd2637673d5653bd6a84c7de77
parenta495628862109950e938c0bdb9d5eaf989280443

std.fs.File.Reader: fix seekBy

Tested locally: stage3/bin/zig build test -Dskip-release -Dskip-non-native closes #24495 closes #24498 closes #24713

2 files changed, 19 insertions(+), 6 deletions(-)

lib/std/fs/File.zig+3-6
......@@ -1247,12 +1247,10 @@ pub const Reader = struct {
12471247 };
12481248 var remaining = std.math.cast(u64, offset) orelse return seek_err;
12491249 while (remaining > 0) {
1250 const n = discard(&r.interface, .limited64(remaining)) catch |err| {
1250 remaining -= discard(&r.interface, .limited64(remaining)) catch |err| {
12511251 r.seek_err = err;
12521252 return err;
12531253 };
1254 r.pos += n;
1255 remaining -= n;
12561254 }
12571255 r.interface.seek = 0;
12581256 r.interface.end = 0;
......@@ -1436,9 +1434,8 @@ pub const Reader = struct {
14361434 fallback: {
14371435 if (r.size_err == null and r.seek_err == null) break :fallback;
14381436 var trash_buffer: [128]u8 = undefined;
1439 const trash = &trash_buffer;
14401437 if (is_windows) {
1441 const n = windows.ReadFile(file.handle, trash, null) catch |err| {
1438 const n = windows.ReadFile(file.handle, limit.slice(&trash_buffer), null) catch |err| {
14421439 r.err = err;
14431440 return error.ReadFailed;
14441441 };
......@@ -1453,7 +1450,7 @@ pub const Reader = struct {
14531450 var iovecs_i: usize = 0;
14541451 var remaining = @intFromEnum(limit);
14551452 while (remaining > 0 and iovecs_i < iovecs.len) {
1456 iovecs[iovecs_i] = .{ .base = trash, .len = @min(trash.len, remaining) };
1453 iovecs[iovecs_i] = .{ .base = &trash_buffer, .len = @min(trash_buffer.len, remaining) };
14571454 remaining -= iovecs[iovecs_i].len;
14581455 iovecs_i += 1;
14591456 }
lib/std/fs/test.zig+16
......@@ -2129,3 +2129,19 @@ test "seek keeping partial buffer" {
21292129
21302130 try testing.expectEqualStrings("6789", &buf);
21312131}
2132
2133test "seekBy" {
2134 var tmp_dir = testing.tmpDir(.{});
2135 defer tmp_dir.cleanup();
2136
2137 try tmp_dir.dir.writeFile(.{ .sub_path = "blah.txt", .data = "let's test seekBy" });
2138 const f = try tmp_dir.dir.openFile("blah.txt", .{ .mode = .read_only });
2139 defer f.close();
2140 var reader = f.readerStreaming(&.{});
2141 try reader.seekBy(2);
2142
2143 var buffer: [20]u8 = undefined;
2144 const n = try reader.interface.readSliceShort(&buffer);
2145 try testing.expectEqual(15, n);
2146 try testing.expectEqualStrings("t's test seekBy", buffer[0..15]);
2147}