Skip to content

Commit a87b533

Browse files
committed
std.Io.Writer: fix some bugs
1 parent b05fefb commit a87b533

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

lib/std/Io/Writer.zig

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish(
270270
remaining -= copy_len;
271271
if (remaining == 0) break :v;
272272
}
273-
for (data[0 .. data.len - 1]) |buf| if (buf.len != 0) {
274-
const copy_len = @min(header.len, remaining);
275-
vecs[i] = buf;
273+
for (data[0 .. data.len - 1]) |buf| {
274+
if (buf.len == 0) continue;
275+
const copy_len = @min(buf.len, remaining);
276+
vecs[i] = buf[0..copy_len];
276277
i += 1;
277278
remaining -= copy_len;
278279
if (remaining == 0) break :v;
279280
if (vecs.len - i == 0) break :v;
280-
};
281+
}
281282
const pattern = data[data.len - 1];
282-
if (splat == 1) {
283+
if (splat == 1 or remaining < pattern.len) {
283284
vecs[i] = pattern[0..@min(remaining, pattern.len)];
284285
i += 1;
285286
break :v;
@@ -915,7 +916,16 @@ pub fn sendFileHeader(
915916
if (new_end <= w.buffer.len) {
916917
@memcpy(w.buffer[w.end..][0..header.len], header);
917918
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;
919929
}
920930
const buffered_contents = limit.slice(file_reader.interface.buffered());
921931
const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1);

0 commit comments

Comments
 (0)