authorgravatar for steeve@zml.aiSteeve Morin <steeve@zml.ai> 2025-12-30 21:42:19+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-12-31 20:20:51+01:00
log9d497d0d7746d819dc5454361a03637a22ebf972
treee9adbcb59c4ca0a064d712de2feec663dc90e57c
parente956948f99338a7cef7d0e9f0602930f3e0528e1

Update posix.getRandomBytesDevURandom to use linux.statx

Fixes #30631

1 files changed, 36 insertions(+), 6 deletions(-)

lib/std/posix.zig+36-6
......@@ -418,12 +418,42 @@ fn getRandomBytesDevURandom(buf: []u8) GetRandomError!void {
418418 const fd = try openZ("/dev/urandom", .{ .ACCMODE = .RDONLY, .CLOEXEC = true }, 0);
419419 defer close(fd);
420420
421 const st = fstat(fd) catch |err| switch (err) {
422 error.Streaming => return error.NoDevice,
423 else => |e| return e,
424 };
425 if (!S.ISCHR(st.mode)) {
426 return error.NoDevice;
421 switch (native_os) {
422 .linux => {
423 var stx = std.mem.zeroes(linux.Statx);
424 const rc = linux.statx(
425 fd,
426 "",
427 linux.AT.EMPTY_PATH,
428 .{ .TYPE = true },
429 &stx,
430 );
431 switch (errno(rc)) {
432 .SUCCESS => {},
433 .ACCES => unreachable,
434 .BADF => unreachable,
435 .FAULT => unreachable,
436 .INVAL => unreachable,
437 .LOOP => unreachable,
438 .NAMETOOLONG => unreachable,
439 .NOENT => unreachable,
440 .NOMEM => return error.SystemResources,
441 .NOTDIR => unreachable,
442 else => |err| return unexpectedErrno(err),
443 }
444 if (!S.ISCHR(stx.mode)) {
445 return error.NoDevice;
446 }
447 },
448 else => {
449 const st = fstat(fd) catch |err| switch (err) {
450 error.Streaming => return error.NoDevice,
451 else => |e| return e,
452 };
453 if (!S.ISCHR(st.mode)) {
454 return error.NoDevice;
455 }
456 },
427457 }
428458
429459 var i: usize = 0;