From: Hans Leidekker Subject: [PATCH] ntdll: Fall back to reading /dev/urandom if getrandom() is not supported. Message-Id: <20210316084648.244256-1-hans@codeweavers.com> Date: Tue, 16 Mar 2021 09:46:48 +0100 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50168 Signed-off-by: Hans Leidekker --- dlls/ntdll/unix/system.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 48321957fb8..6fa71ddfb91 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -2036,6 +2036,22 @@ static void get_timezone_info( RTL_DYNAMIC_TIME_ZONE_INFORMATION *tzi ) } +static void read_dev_urandom( void *buf, ULONG len ) +{ + int fd = open( "/dev/urandom", O_RDONLY ); + if (fd != -1) + { + int ret; + do + { + ret = read( fd, buf, len ); + } + while (ret == -1 && errno == EINTR); + close( fd ); + } + else WARN( "can't open /dev/urandom\n" ); +} + /****************************************************************************** * NtQuerySystemInformation (NTDLL.@) */ @@ -2525,19 +2541,10 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class, ret = getrandom( info, len, 0 ); } while (ret == -1 && errno == EINTR); + + if (ret == -1 && errno == ENOSYS) read_dev_urandom( info, len ); #else - int fd = open( "/dev/urandom", O_RDONLY ); - if (fd != -1) - { - int ret; - do - { - ret = read( fd, info, len ); - } - while (ret == -1 && errno == EINTR); - close( fd ); - } - else WARN( "can't open /dev/urandom\n" ); + read_dev_urandom( info, len ); #endif } } -- 2.30.2