From 0b33385f114010534d942f138c8c048b82c861f6 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 16 Mar 2021 09:46:48 +0100 Subject: [PATCH] ntdll: Fall back to reading /dev/urandom if getrandom() is not supported. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50168 Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard (cherry picked from commit e6407c39bab62838081f30868cb2ac1362029bdf) Signed-off-by: Michael Stefaniuc --- 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 e2482f91041..9a51971fe36 100644 --- a/dlls/ntdll/unix/system.c +++ b/dlls/ntdll/unix/system.c @@ -2056,6 +2056,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.@) */ @@ -2541,19 +2557,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 } }