From 043079d7655efefbec97d8338b7d7fa3f9fcbdb0 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 7 Jul 2025 21:47:32 -0700 Subject: [PATCH] std.io.Writer.VectorWrapper: fix vtable not being a unique addr --- lib/std/io/Reader.zig | 4 ++-- lib/std/io/Writer.zig | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/std/io/Reader.zig b/lib/std/io/Reader.zig index f9abb2dd4d..0d7b891899 100644 --- a/lib/std/io/Reader.zig +++ b/lib/std/io/Reader.zig @@ -323,7 +323,7 @@ pub fn readVecLimit(r: *Reader, data: []const []u8, limit: Limit) Error!usize { }, .writer = .{ .buffer = if (first.len >= r.buffer.len) first else r.buffer, - .vtable = &Writer.VectorWrapper.vtable, + .vtable = Writer.VectorWrapper.vtable, }, }; var n = r.vtable.stream(r, &wrapper.writer, .limited(remaining)) catch |err| switch (err) { @@ -599,7 +599,7 @@ pub fn readSliceShort(r: *Reader, buffer: []u8) ShortError!usize { }, .writer = .{ .buffer = if (remaining.len >= r.buffer.len) remaining else r.buffer, - .vtable = &Writer.VectorWrapper.vtable, + .vtable = Writer.VectorWrapper.vtable, }, }; const n = r.vtable.stream(r, &wrapper.writer, .unlimited) catch |err| switch (err) { diff --git a/lib/std/io/Writer.zig b/lib/std/io/Writer.zig index 1e794fb255..8cf0e50a8b 100644 --- a/lib/std/io/Writer.zig +++ b/lib/std/io/Writer.zig @@ -392,11 +392,14 @@ pub const VectorWrapper = struct { it: WritableVectorIterator, /// Tracks whether the "writable vector" API was used. used: bool = false, - pub const vtable: VTable = .{ .drain = fixedDrain }; + pub const vtable: *const VTable = &unique_vtable_allocation; + /// This is intended to be constant but it must be a unique address for + /// `@fieldParentPtr` to work. + var unique_vtable_allocation: VTable = .{ .drain = fixedDrain }; }; pub fn writableVectorIterator(w: *Writer) Error!WritableVectorIterator { - if (w.vtable == &VectorWrapper.vtable) { + if (w.vtable == VectorWrapper.vtable) { const wrapper: *VectorWrapper = @fieldParentPtr("writer", w); wrapper.used = true; return wrapper.it;