zig/lib/std
Ryan Liptak 3fbb88c4bd Reader.defaultReadVec: Workaround bad r.end += r.vtable.stream() behavior
If `r.end` is updated in the `stream` implementation, then it's possible that `r.end += ...` will behave unexpectedly. What seems to happen is that it reverts back to its value before the function call and then the increment happens. Here's a reproduction:

```zig
test "fill when stream modifies `end` and returns 0" {
    var buf: [3]u8 = undefined;
    var zero_reader = infiniteZeroes(&buf);

    _ = try zero_reader.fill(1);
    try std.testing.expectEqual(buf.len, zero_reader.end);
}

pub fn infiniteZeroes(buf: []u8) std.Io.Reader {
    return .{
        .vtable = &.{
            .stream = stream,
        },
        .buffer = buf,
        .end = 0,
        .seek = 0,
    };
}

fn stream(r: *std.Io.Reader, _: *std.Io.Writer, _: std.Io.Limit) std.Io.Reader.StreamError!usize {
    @memset(r.buffer[r.seek..], 0);
    r.end = r.buffer.len;
    return 0;
}
```

When `fill` is called, it will call into `vtable.readVec` which in this case is `defaultReadVec`. In `defaultReadVec`:

- Before the `r.end += r.vtable.stream` line, `r.end` will be 0
- In `r.vtable.stream`, `r.end` is modified to 3 and it returns 0
- After the `r.end += r.vtable.stream` line, `r.end` will be 0 instead of the expected 3

Separating the `r.end += stream();` into two lines fixes the problem (and this separation is done elsewhere in `Reader` so it seems possible that this class of bug has been encountered before).

Potentially related issues:

- https://github.com/ziglang/zig/issues/4021
- https://github.com/ziglang/zig/issues/12064
2025-09-20 18:31:38 -07:00
..
Build std.Build.Step.Run: Enable passing (generated) file content as args 2025-09-19 17:38:40 -07:00
builtin start adding big endian RISC-V support 2025-08-25 16:15:17 +02:00
c std.c: adjust shm_open to be variadic on darwin 2025-09-20 07:33:50 +02:00
compress lzma2: fix premature finish 2025-09-03 01:48:46 -07:00
crypto std.crypto.ascon: disable Ascon-AEAD128 test on RISC-V with V support 2025-09-20 19:05:32 +02:00
debug rework std.Io.Writer.Allocating to support runtime-known alignment 2025-08-30 00:48:50 -07:00
dwarf
fmt std.fmt: breaking API changes 2025-07-07 22:43:51 -07:00
fs Revert "Merge pull request #24905 from gooncreeper/file-reader-buffered" 2025-09-05 11:26:38 -07:00
hash Remove usages of deprecatedWriter 2025-09-18 22:39:33 -07:00
heap std.ArrayList: make unmanaged the default 2025-08-11 15:52:49 -07:00
http std.http.Client.Connection: make host() public 2025-09-06 19:23:27 -07:00
Io Reader.defaultReadVec: Workaround bad r.end += r.vtable.stream() behavior 2025-09-20 18:31:38 -07:00
json add some new fuzz tests 2025-09-18 18:56:18 -04:00
math std.math.modf: disable vector test on LoongArch with LSX 2025-09-18 12:42:24 +02:00
mem Add allocator that always fails 2025-09-03 21:46:01 -07:00
meta
net std.net.Ip6Address: format numerical scope id 2025-09-15 10:45:35 +01:00
os Merge pull request #25195 from blblack/netdefs 2025-09-17 21:43:23 -07:00
posix standalone posix tests for sigaction 2025-09-09 22:07:44 -07:00
process std.fmt: migrate bufPrintZ to bufPrintSentinel (#25260) 2025-09-19 05:02:22 +00:00
Random Remove usages of deprecatedWriter 2025-09-18 22:39:33 -07:00
sort std.sort.pdq: fix out-of-bounds access in partialInsertionSort (#25253) 2025-09-17 19:54:15 -07:00
tar std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
Target std.Target: adjustments to LoongArch CPU models 2025-09-18 12:42:24 +02:00
testing
Thread Remove numerous things deprecated during the 0.14 release cycle 2025-07-11 08:17:43 +02:00
time
tz
unicode Remove usages of deprecatedWriter 2025-09-18 22:39:33 -07:00
valgrind Remove numerous things deprecated during the 0.14 release cycle 2025-07-11 08:17:43 +02:00
zig Merge pull request #23416 from gooncreeper/improved-fuzzer 2025-09-19 09:27:25 -07:00
zon Adds non allocating alternatives to ZON parse functions (#22916) 2025-08-25 18:03:08 +02:00
array_hash_map.zig std: introduce orderedRemoveMany 2025-08-11 13:32:12 -07:00
array_list.zig upgrade more old API uses 2025-08-30 00:48:50 -07:00
ascii.zig std.fmt: delete deprecated APIs 2025-08-31 12:49:18 -07:00
atomic.zig start adding big endian RISC-V support 2025-08-25 16:15:17 +02:00
base64.zig std.Io: delete GenericWriter 2025-08-28 18:30:57 -07:00
bit_set.zig std.bit_set: Disable IntegerBitSet decltest on RISC-V with vector support 2025-07-01 23:03:15 +02:00
BitStack.zig std.ArrayList: make unmanaged the default 2025-08-11 15:52:49 -07:00
buf_map.zig
buf_set.zig
Build.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
builtin.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
c.zig std.c: add MSG support for dragonfly 2025-09-20 19:21:14 +02:00
coff.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
compress.zig std.compress: rework flate to new I/O API 2025-07-31 22:10:11 -07:00
crypto.zig Merge pull request #25249 from jedisct1/siv 2025-09-17 20:05:23 -07:00
debug.zig std.debug.assertAligned: support const pointers 2025-09-07 20:22:38 -07:00
deque.zig Compilation: use std.Deque 2025-08-26 09:39:09 +02:00
DoublyLinkedList.zig
dwarf.zig
dynamic_library.zig x86_64: add support for pie executables 2025-06-06 23:42:14 -07:00
elf.zig std.elf: change STV enum from u2 to u3 2025-09-04 01:16:23 +02:00
enums.zig std.enums: fix EnumIndexer branch quota 2025-07-31 22:10:22 +01:00
fmt.zig std.fmt: migrate bufPrintZ to bufPrintSentinel (#25260) 2025-09-19 05:02:22 +00:00
fs.zig std.fmt: migrate bufPrintZ to bufPrintSentinel (#25260) 2025-09-19 05:02:22 +00:00
gpu.zig
hash.zig simplify std.hash.Adler32 2025-07-31 22:10:11 -07:00
hash_map.zig use pointer subtraction 2025-09-11 00:18:37 -07:00
heap.zig std.c.darwin: cleanup, expose everything in std.c 2025-08-20 18:21:32 +02:00
http.zig http.BodyWriter: improve clarity of chunked state machine 2025-08-17 14:42:57 +02:00
Io.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
json.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
leb128.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
log.zig Remove usages of deprecatedWriter 2025-09-18 22:39:33 -07:00
macho.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
math.zig std: skip some failing tests on hexagon 2025-08-30 06:36:41 +02:00
mem.zig std.mem: work around LoongArch inline asm bug in doNotOptimizeAway() 2025-09-18 10:08:38 +02:00
meta.zig std.fmt: migrate bufPrintZ to bufPrintSentinel (#25260) 2025-09-19 05:02:22 +00:00
multi_array_list.zig std: introduce orderedRemoveMany 2025-08-11 13:32:12 -07:00
net.zig std.net.Ip6Address: format numerical scope id 2025-09-15 10:45:35 +01:00
once.zig
os.zig std.fmt: migrate bufPrintZ to bufPrintSentinel (#25260) 2025-09-19 05:02:22 +00:00
pdb.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
pie.zig start adding big endian RISC-V support 2025-08-25 16:15:17 +02:00
posix.zig std.fmt: migrate bufPrintZ to bufPrintSentinel (#25260) 2025-09-19 05:02:22 +00:00
priority_dequeue.zig std.ArrayList: make unmanaged the default 2025-08-11 15:52:49 -07:00
priority_queue.zig
process.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
Progress.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
Random.zig
SemanticVersion.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
simd.zig std.simd: suggest more sensible vector sizes across the board 2025-09-19 04:01:08 +02:00
SinglyLinkedList.zig
sort.zig
start.zig start adding big endian RISC-V support 2025-08-25 16:15:17 +02:00
static_string_map.zig
std.zig std: delete SegmentedList again 2025-09-19 16:40:00 -07:00
tar.zig std.tar: update to new I/O API 2025-07-22 09:41:44 -07:00
Target.zig std.Target: adjustments to LoongArch CPU models 2025-09-18 12:42:24 +02:00
testing.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
Thread.zig Move some Thread tests out of posix/test.zig into Thread.zig 2025-09-09 22:06:20 -07:00
time.zig std.os.uefi.tables: ziggify boot and runtime services (#23441) 2025-07-12 17:18:53 +00:00
treap.zig std.ArrayList: make unmanaged the default 2025-08-11 15:52:49 -07:00
tz.zig std.tz: fix redundant endian handling 2025-08-28 18:30:57 -07:00
unicode.zig std.fmt: delete deprecated APIs 2025-08-31 12:49:18 -07:00
Uri.zig std.fmt: delete deprecated APIs 2025-08-31 12:49:18 -07:00
valgrind.zig remove condition codes 2025-07-16 10:27:39 -07:00
wasm.zig
zig.zig std.fmt: delete deprecated APIs 2025-08-31 12:49:18 -07:00
zip.zig std.Io: delete GenericReader 2025-08-29 17:14:26 -07:00
zon.zig zon: Add anonymous struct literal in the example 2025-08-15 23:35:16 +02:00