authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-11-19 17:11:41+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-11-20 10:42:21+00:00
loga87b5332319b20347916f77e57253e2df4b2a3af
tree27f84c4981f878b2f5f0c9c9edb881d135ff1eb6
parentb05fefb9c9bf3065e353102d0e54ea76d5f4e34d
signaturelock-open Commit is signed but in an unrecognized format.

std.Io.Writer: fix some bugs


1 files changed, 16 insertions(+), 6 deletions(-)

lib/std/Io/Writer.zig+16-6
...@@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish(...@@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish(
270 remaining -= copy_len;270 remaining -= copy_len;
271 if (remaining == 0) break :v;271 if (remaining == 0) break :v;
272 }272 }
273 for (data[0 .. data.len - 1]) |buf| if (buf.len != 0) {273 for (data[0 .. data.len - 1]) |buf| {
274 const copy_len = @min(header.len, remaining);274 if (buf.len == 0) continue;
275 vecs[i] = buf;275 const copy_len = @min(buf.len, remaining);
276 vecs[i] = buf[0..copy_len];
276 i += 1;277 i += 1;
277 remaining -= copy_len;278 remaining -= copy_len;
278 if (remaining == 0) break :v;279 if (remaining == 0) break :v;
279 if (vecs.len - i == 0) break :v;280 if (vecs.len - i == 0) break :v;
280 };281 }
281 const pattern = data[data.len - 1];282 const pattern = data[data.len - 1];
282 if (splat == 1) {283 if (splat == 1 or remaining < pattern.len) {
283 vecs[i] = pattern[0..@min(remaining, pattern.len)];284 vecs[i] = pattern[0..@min(remaining, pattern.len)];
284 i += 1;285 i += 1;
285 break :v;286 break :v;
...@@ -915,7 +916,16 @@ pub fn sendFileHeader(...@@ -915,7 +916,16 @@ pub fn sendFileHeader(
915 if (new_end <= w.buffer.len) {916 if (new_end <= w.buffer.len) {
916 @memcpy(w.buffer[w.end..][0..header.len], header);917 @memcpy(w.buffer[w.end..][0..header.len], header);
917 w.end = new_end;918 w.end = new_end;
918 return header.len + try w.vtable.sendFile(w, file_reader, limit);919 const file_bytes = w.vtable.sendFile(w, file_reader, limit) catch |err| switch (err) {
920 error.ReadFailed, error.WriteFailed => |e| return e,
921 error.EndOfStream, error.Unimplemented => |e| {
922 // These errors are non-fatal, so if we wrote any header bytes, we will report that
923 // and suppress this error. Only if there was no header may we return the error.
924 if (header.len != 0) return header.len;
925 return e;
926 },
927 };
928 return header.len + file_bytes;
919 }929 }
920 const buffered_contents = limit.slice(file_reader.interface.buffered());930 const buffered_contents = limit.slice(file_reader.interface.buffered());
921 const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1);931 const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1);