diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-08-13 12:24:14 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2025-08-13 12:24:14 -0700 |
| commit | 5e986fef1fa5cf04f3547cc4f5a8c0f490ea1d3d (patch) | |
| tree | 88119d0e1a5696bd2637673d5653bd6a84c7de77 /lib/std/fs | |
| parent | a495628862109950e938c0bdb9d5eaf989280443 (diff) | |
| download | zig-5e986fef1fa5cf04f3547cc4f5a8c0f490ea1d3d.tar.gz zig-5e986fef1fa5cf04f3547cc4f5a8c0f490ea1d3d.zip | |
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 (limited to 'lib/std/fs')
| -rw-r--r-- | lib/std/fs/File.zig | 9 | ||||
| -rw-r--r-- | lib/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 index ace7cb8292..c698840f24 100644 --- 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 index d51fe3db0e..60879a5ead 100644 --- 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]); +} |
