From 90f0d7d0dad706dbfd170f65a12d96d41ebb8c3e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 5 Jan 2026 21:20:20 -0800 Subject: [PATCH] std.Io.Threaded: implement random seed fallback for WASI --- lib/std/Io/Threaded.zig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index f26989338bbe2538989979298433ef05dbc6cbe1..6158c63edae88b3f11c7f1dd0fa4a2a67f1f705a 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -15101,6 +15101,7 @@ fn randomMainThread(t: *Threaded, buffer: []u8) void { std.mem.writeInt(usize, seed[seed.len - @sizeOf(usize) ..][0..@sizeOf(usize)], aslr_addr, .native); switch (native_os) { .windows => fallbackSeedWindows(&seed), + .wasi => if (builtin.link_libc) fallbackSeedPosix(&seed) else fallbackSeedWasi(&seed), else => fallbackSeedPosix(&seed), } }, @@ -15135,6 +15136,13 @@ fn fallbackSeedWindows(seed: *[Csprng.seed_len]u8) void { std.mem.writeInt(windows.LARGE_INTEGER, seed[0..@sizeOf(windows.LARGE_INTEGER)], pc, .native); } +fn fallbackSeedWasi(seed: *[Csprng.seed_len]u8) void { + var ts: std.os.wasi.timestamp_t = undefined; + if (std.os.wasi.clock_time_get(.REALTIME, 1, &ts) == .SUCCESS) { + std.mem.writeInt(std.os.wasi.timestamp_t, seed[0..@sizeOf(std.os.wasi.timestamp_t)], ts, .native); + } +} + fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void { const t: *Threaded = @ptrCast(@alignCast(userdata)); -- 2.54.0