authorgravatar for 56300765+Josh-Walker-GM@users.noreply.github.comJosh GM Walker <56300765+Josh-Walker-GM@users.noreply.github.com> 2025-09-04 05:43:47+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-09-03 21:43:47-07:00
logb1189ab038ad1885f961562bf188f0bd3da12153
tree6cd6f6c77a0de4942f0ccacb06844bf422e02057
parent32a34b64caaefd1a0ae78b6d344da9812cb0cdb8
signaturebadge-check Signed by PGP key B5690EEEBB952194

fix: std.fs.File.Writer.seekTo does not flush (#25135)

* add failing test case * perform flush and allow error * dont over constrain flush error * reset seek error during conversion

2 files changed, 31 insertions(+), 3 deletions(-)

lib/std/fs/File.zig+6-3
......@@ -1505,7 +1505,7 @@ pub const Writer = struct {
15051505 sendfile_err: ?SendfileError = null,
15061506 copy_file_range_err: ?CopyFileRangeError = null,
15071507 fcopyfile_err: ?FcopyfileError = null,
1508 seek_err: ?SeekError = null,
1508 seek_err: ?Writer.SeekError = null,
15091509 interface: std.Io.Writer,
15101510
15111511 pub const Mode = Reader.Mode;
......@@ -1527,6 +1527,8 @@ pub const Writer = struct {
15271527 Unexpected,
15281528 };
15291529
1530 pub const SeekError = File.SeekError || std.Io.Writer.Error;
1531
15301532 /// Number of slices to store on the stack, when trying to send as many byte
15311533 /// vectors through the underlying write calls as possible.
15321534 const max_buffers_len = 16;
......@@ -1570,7 +1572,7 @@ pub const Writer = struct {
15701572 .mode = w.mode,
15711573 .pos = w.pos,
15721574 .interface = Reader.initInterface(w.interface.buffer),
1573 .seek_err = w.seek_err,
1575 .seek_err = null,
15741576 };
15751577 }
15761578
......@@ -2000,7 +2002,8 @@ pub const Writer = struct {
20002002 return n;
20012003 }
20022004
2003 pub fn seekTo(w: *Writer, offset: u64) SeekError!void {
2005 pub fn seekTo(w: *Writer, offset: u64) Writer.SeekError!void {
2006 try w.interface.flush();
20042007 switch (w.mode) {
20052008 .positional, .positional_reading => {
20062009 w.pos = offset;
lib/std/fs/test.zig+25
......@@ -2155,3 +2155,28 @@ test "seekBy" {
21552155 try testing.expectEqual(15, n);
21562156 try testing.expectEqualStrings("t's test seekBy", buffer[0..15]);
21572157}
2158
2159test "seekTo flushes buffered data" {
2160 var tmp = std.testing.tmpDir(.{});
2161 defer tmp.cleanup();
2162
2163 const contents = "data";
2164
2165 const file = try tmp.dir.createFile("seek.bin", .{ .read = true });
2166 defer file.close();
2167 {
2168 var buf: [16]u8 = undefined;
2169 var file_writer = std.fs.File.writer(file, &buf);
2170
2171 try file_writer.interface.writeAll(contents);
2172 try file_writer.seekTo(8);
2173 try file_writer.interface.flush();
2174 }
2175
2176 var read_buffer: [16]u8 = undefined;
2177 var file_reader: std.fs.File.Reader = .init(file, &read_buffer);
2178
2179 var buf: [4]u8 = undefined;
2180 try file_reader.interface.readSliceAll(&buf);
2181 try std.testing.expectEqualStrings(contents, &buf);
2182}