aboutsummaryrefslogtreecommitdiff
path: root/lib/std/fs
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-08-13 12:24:14 -0700
committerAndrew Kelley <andrew@ziglang.org>2025-08-13 12:24:14 -0700
commit5e986fef1fa5cf04f3547cc4f5a8c0f490ea1d3d (patch)
tree88119d0e1a5696bd2637673d5653bd6a84c7de77 /lib/std/fs
parenta495628862109950e938c0bdb9d5eaf989280443 (diff)
downloadzig-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.zig9
-rw-r--r--lib/std/fs/test.zig16
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]);
+}