zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 5e986fef1fa5cf04f3547cc4f5a8c0f490ea1d3d (tree)
parent a495628862109950e938c0bdb9d5eaf989280443
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Wed, 13 Aug 2025 12:24:14 -0700

std.fs.File.Reader: fix seekBy

Tested locally:

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

closes #24495
closes #24498
closes #24713

Diffstat:
Mlib/std/fs/File.zig | 9+++------
Mlib/std/fs/test.zig | 16++++++++++++++++
2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/lib/std/fs/File.zig b/lib/std/fs/File.zig @@ -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; } diff --git a/lib/std/fs/test.zig b/lib/std/fs/test.zig @@ -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]); +}