authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-06 17:29:39-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-01-07 11:03:37-08:00
log8e1850e277c3112eda44b8bb3de95ef1791eccfa
treeab876b5d74d1cd9040a41c187336e5a17e758943
parent61cb5e4af92cd96247c59974cb3d59e5900926c1

std.Io.Threaded: tweak logic for use_dev_urandom


1 files changed, 40 insertions(+), 37 deletions(-)

lib/std/Io/Threaded.zig+40-37
......@@ -1744,18 +1744,17 @@ const statx_use_c = std.c.versionCheck(if (builtin.abi.isAndroid())
17441744else
17451745 .{ .major = 2, .minor = 28, .patch = 0 });
17461746
1747const getrandom_use_libc = @TypeOf(posix.system.getrandom) != void and (native_os != .linux or
1748 std.c.versionCheck(if (builtin.abi.isAndroid()) .{
1749 .major = 28,
1750 .minor = 0,
1751 .patch = 0,
1752 } else .{
1753 .major = 2,
1754 .minor = 25,
1755 .patch = 0,
1756 }));
1747const use_libc_getrandom = std.c.versionCheck(if (builtin.abi.isAndroid()) .{
1748 .major = 28,
1749 .minor = 0,
1750 .patch = 0,
1751} else .{
1752 .major = 2,
1753 .minor = 25,
1754 .patch = 0,
1755});
17571756
1758const use_dev_urandom = !getrandom_use_libc and native_os == .linux;
1757const use_dev_urandom = @TypeOf(posix.system.getrandom) == void and native_os == .linux;
17591758
17601759fn async(
17611760 userdata: ?*anyopaque,
......@@ -15149,9 +15148,9 @@ fn fallbackSeedWasi(seed: *[Csprng.seed_len]u8) void {
1514915148
1515015149fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void {
1515115150 const t: *Threaded = @ptrCast(@alignCast(userdata));
15151 if (buffer.len == 0) return;
1515215152
1515315153 if (is_windows) {
15154 if (buffer.len == 0) return;
1515515154 // ProcessPrng from bcryptprimitives.dll has the following properties:
1515615155 // * introduces a dependency on bcryptprimitives.dll, which apparently
1515715156 // runs a test suite every time it is loaded
......@@ -15213,7 +15212,7 @@ fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void {
1521315212 }
1521415213
1521515214 if (@TypeOf(posix.system.getrandom) != void) {
15216 const getrandom = if (getrandom_use_libc) std.c.getrandom else std.os.linux.getrandom;
15215 const getrandom = if (use_libc_getrandom) std.c.getrandom else std.os.linux.getrandom;
1521715216 var i: usize = 0;
1521815217 const syscall: Syscall = try .start();
1521915218 while (i < buffer.len) {
......@@ -15244,34 +15243,38 @@ fn randomSecure(userdata: ?*anyopaque, buffer: []u8) Io.RandomSecureError!void {
1524415243 }
1524515244 }
1524615245
15247 if (buffer.len == 0) return;
15248 const urandom_fd = try getRandomFd(t);
15246 if (native_os == .linux) {
15247 comptime assert(use_dev_urandom);
15248 const urandom_fd = try getRandomFd(t);
1524915249
15250 var i: usize = 0;
15251 while (buffer.len - i != 0) {
15252 const syscall: Syscall = try .start();
15253 const rc = posix.system.read(urandom_fd, buffer[i..].ptr, buffer.len - i);
15254 switch (posix.errno(rc)) {
15255 .SUCCESS => {
15256 syscall.finish();
15257 const n: usize = @intCast(rc);
15258 if (n == 0) {
15259 if (buffer.len - i != 0) {
15260 return error.EntropyUnavailable;
15261 } else {
15262 return;
15250 var i: usize = 0;
15251 while (buffer.len - i != 0) {
15252 const syscall: Syscall = try .start();
15253 const rc = posix.system.read(urandom_fd, buffer[i..].ptr, buffer.len - i);
15254 switch (posix.errno(rc)) {
15255 .SUCCESS => {
15256 syscall.finish();
15257 const n: usize = @intCast(rc);
15258 if (n == 0) {
15259 if (buffer.len - i != 0) {
15260 return error.EntropyUnavailable;
15261 } else {
15262 return;
15263 }
1526315264 }
15264 }
15265 i += n;
15266 continue;
15267 },
15268 .INTR => {
15269 try syscall.checkCancel();
15270 continue;
15271 },
15272 else => return syscall.fail(error.EntropyUnavailable),
15265 i += n;
15266 continue;
15267 },
15268 .INTR => {
15269 try syscall.checkCancel();
15270 continue;
15271 },
15272 else => return syscall.fail(error.EntropyUnavailable),
15273 }
1527315274 }
1527415275 }
15276
15277 return error.EntropyUnavailable;
1527515278}
1527615279
1527715280fn getRandomFd(t: *Threaded) Io.RandomSecureError!posix.fd_t {