authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-05-02 19:45:51-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:28-07:00
logb0d825948a77d0ec3de794680e168ffd0a29e1fe
treeaa97a307184b778bbc9aca7fd01f8622a29fba28
parent5ac895c82066ad02e8d9232077d43fbb9bc5a6d9

std.fs.File: fix missing end of stream


1 files changed, 4 insertions(+), 2 deletions(-)

lib/std/fs/File.zig+4-2
...@@ -1158,20 +1158,21 @@ pub const Reader = struct {...@@ -1158,20 +1158,21 @@ pub const Reader = struct {
1158 // end.1158 // end.
1159 fallback: {1159 fallback: {
1160 if (r.size_err == null and r.seek_err == null) break :fallback;1160 if (r.size_err == null and r.seek_err == null) break :fallback;
1161 var trash_buffer: [std.atomic.cache_line]u8 = undefined;1161 var trash_buffer: [128]u8 = undefined;
1162 const trash = &trash_buffer;1162 const trash = &trash_buffer;
1163 if (is_windows) {1163 if (is_windows) {
1164 const n = windows.ReadFile(file.handle, trash, null) catch |err| {1164 const n = windows.ReadFile(file.handle, trash, null) catch |err| {
1165 r.err = err;1165 r.err = err;
1166 return error.ReadFailed;1166 return error.ReadFailed;
1167 };1167 };
1168 if (n == 0) return error.EndOfStream;
1168 r.pos = pos + n;1169 r.pos = pos + n;
1169 return n;1170 return n;
1170 }1171 }
1171 var iovecs: [max_buffers_len]std.posix.iovec = undefined;1172 var iovecs: [max_buffers_len]std.posix.iovec = undefined;
1172 var iovecs_i: usize = 0;1173 var iovecs_i: usize = 0;
1173 var remaining = @intFromEnum(limit);1174 var remaining = @intFromEnum(limit);
1174 while (remaining > 0 and iovecs_i >= iovecs.len) {1175 while (remaining > 0 and iovecs_i < iovecs.len) {
1175 iovecs[iovecs_i] = .{ .base = trash, .len = @min(trash.len, remaining) };1176 iovecs[iovecs_i] = .{ .base = trash, .len = @min(trash.len, remaining) };
1176 remaining -= iovecs[iovecs_i].len;1177 remaining -= iovecs[iovecs_i].len;
1177 iovecs_i += 1;1178 iovecs_i += 1;
...@@ -1180,6 +1181,7 @@ pub const Reader = struct {...@@ -1180,6 +1181,7 @@ pub const Reader = struct {
1180 r.err = err;1181 r.err = err;
1181 return error.ReadFailed;1182 return error.ReadFailed;
1182 };1183 };
1184 if (n == 0) return error.EndOfStream;
1183 r.pos = pos + n;1185 r.pos = pos + n;
1184 return n;1186 return n;
1185 }1187 }