From 9d497d0d7746d819dc5454361a03637a22ebf972 Mon Sep 17 00:00:00 2001 From: Steeve Morin Date: Tue, 30 Dec 2025 21:42:19 +0000 Subject: [PATCH] Update posix.getRandomBytesDevURandom to use linux.statx Fixes #30631 --- lib/std/posix.zig | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/std/posix.zig b/lib/std/posix.zig index 52bc5f83e8b0a37e9b3346d1d6fb70005ef695f4..e56b9c095caeb339d4d2d36e17dacbc770796306 100644 --- a/lib/std/posix.zig +++ b/lib/std/posix.zig @@ -418,12 +418,42 @@ fn getRandomBytesDevURandom(buf: []u8) GetRandomError!void { const fd = try openZ("/dev/urandom", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0); defer close(fd); - const st = fstat(fd) catch |err| switch (err) { - error.Streaming => return error.NoDevice, - else => |e| return e, - }; - if (!S.ISCHR(st.mode)) { - return error.NoDevice; + switch (native_os) { + .linux => { + var stx = std.mem.zeroes(linux.Statx); + const rc = linux.statx( + fd, + "", + linux.AT.EMPTY_PATH, + .{ .TYPE = true }, + &stx, + ); + switch (errno(rc)) { + .SUCCESS => {}, + .ACCES => unreachable, + .BADF => unreachable, + .FAULT => unreachable, + .INVAL => unreachable, + .LOOP => unreachable, + .NAMETOOLONG => unreachable, + .NOENT => unreachable, + .NOMEM => return error.SystemResources, + .NOTDIR => unreachable, + else => |err| return unexpectedErrno(err), + } + if (!S.ISCHR(stx.mode)) { + return error.NoDevice; + } + }, + else => { + const st = fstat(fd) catch |err| switch (err) { + error.Streaming => return error.NoDevice, + else => |e| return e, + }; + if (!S.ISCHR(st.mode)) { + return error.NoDevice; + } + }, } var i: usize = 0; -- 2.54.0