aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Io/Writer.zig
diff options
context:
space:
mode:
authorMatthew Lugg <mlugg@mlugg.co.uk>2025-11-20 17:48:35 +0000
committerGitHub <noreply@github.com>2025-11-20 17:48:35 +0000
commit8a73fc8d8ee0065e4d07e473ce6ab095cebfaece (patch)
tree36bed2955666bdfce7b96e2f33c9409bd26f03c1 /lib/std/Io/Writer.zig
parenta9568ed2963298864e5c9a92a3eafe81771128ff (diff)
parenta87b5332319b20347916f77e57253e2df4b2a3af (diff)
downloadzig-8a73fc8d8ee0065e4d07e473ce6ab095cebfaece.tar.gz
zig-8a73fc8d8ee0065e4d07e473ce6ab095cebfaece.zip
Merge pull request #25981 from mlugg/macos-fuzz-2
make the fuzzer vaguely work on macOS
Diffstat (limited to 'lib/std/Io/Writer.zig')
-rw-r--r--lib/std/Io/Writer.zig22
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/std/Io/Writer.zig b/lib/std/Io/Writer.zig
index 0dc7923f05..d44800cd60 100644
--- a/lib/std/Io/Writer.zig
+++ b/lib/std/Io/Writer.zig
@@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish(
remaining -= copy_len;
if (remaining == 0) break :v;
}
- for (data[0 .. data.len - 1]) |buf| if (buf.len != 0) {
- const copy_len = @min(header.len, remaining);
- vecs[i] = buf;
+ for (data[0 .. data.len - 1]) |buf| {
+ if (buf.len == 0) continue;
+ const copy_len = @min(buf.len, remaining);
+ vecs[i] = buf[0..copy_len];
i += 1;
remaining -= copy_len;
if (remaining == 0) break :v;
if (vecs.len - i == 0) break :v;
- };
+ }
const pattern = data[data.len - 1];
- if (splat == 1) {
+ if (splat == 1 or remaining < pattern.len) {
vecs[i] = pattern[0..@min(remaining, pattern.len)];
i += 1;
break :v;
@@ -915,7 +916,16 @@ pub fn sendFileHeader(
if (new_end <= w.buffer.len) {
@memcpy(w.buffer[w.end..][0..header.len], header);
w.end = new_end;
- return header.len + try w.vtable.sendFile(w, file_reader, limit);
+ const file_bytes = w.vtable.sendFile(w, file_reader, limit) catch |err| switch (err) {
+ error.ReadFailed, error.WriteFailed => |e| return e,
+ error.EndOfStream, error.Unimplemented => |e| {
+ // These errors are non-fatal, so if we wrote any header bytes, we will report that
+ // and suppress this error. Only if there was no header may we return the error.
+ if (header.len != 0) return header.len;
+ return e;
+ },
+ };
+ return header.len + file_bytes;
}
const buffered_contents = limit.slice(file_reader.interface.buffered());
const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1);