std.fs.File.Reader: fix seekBy

Tested locally:

stage3/bin/zig build test -Dskip-release -Dskip-non-native

closes #24495
closes #24498
closes #24713
This commit is contained in:
Andrew Kelley 2025-08-13 12:24:14 -07:00
parent a495628862
commit 5e986fef1f
2 changed files with 19 additions and 6 deletions

View file

@ -1247,12 +1247,10 @@ pub const Reader = struct {
};
var remaining = std.math.cast(u64, offset) orelse return seek_err;
while (remaining > 0) {
const n = discard(&r.interface, .limited64(remaining)) catch |err| {
remaining -= discard(&r.interface, .limited64(remaining)) catch |err| {
r.seek_err = err;
return err;
};
r.pos += n;
remaining -= n;
}
r.interface.seek = 0;
r.interface.end = 0;
@ -1436,9 +1434,8 @@ pub const Reader = struct {
fallback: {
if (r.size_err == null and r.seek_err == null) break :fallback;
var trash_buffer: [128]u8 = undefined;
const trash = &trash_buffer;
if (is_windows) {
const n = windows.ReadFile(file.handle, trash, null) catch |err| {
const n = windows.ReadFile(file.handle, limit.slice(&trash_buffer), null) catch |err| {
r.err = err;
return error.ReadFailed;
};
@ -1453,7 +1450,7 @@ pub const Reader = struct {
var iovecs_i: usize = 0;
var remaining = @intFromEnum(limit);
while (remaining > 0 and iovecs_i < iovecs.len) {
iovecs[iovecs_i] = .{ .base = trash, .len = @min(trash.len, remaining) };
iovecs[iovecs_i] = .{ .base = &trash_buffer, .len = @min(trash_buffer.len, remaining) };
remaining -= iovecs[iovecs_i].len;
iovecs_i += 1;
}

View file

@ -2129,3 +2129,19 @@ test "seek keeping partial buffer" {
try testing.expectEqualStrings("6789", &buf);
}
test "seekBy" {
var tmp_dir = testing.tmpDir(.{});
defer tmp_dir.cleanup();
try tmp_dir.dir.writeFile(.{ .sub_path = "blah.txt", .data = "let's test seekBy" });
const f = try tmp_dir.dir.openFile("blah.txt", .{ .mode = .read_only });
defer f.close();
var reader = f.readerStreaming(&.{});
try reader.seekBy(2);
var buffer: [20]u8 = undefined;
const n = try reader.interface.readSliceShort(&buffer);
try testing.expectEqual(15, n);
try testing.expectEqualStrings("t's test seekBy", buffer[0..15]);
}