[PATCH] ntdll: Fall back to reading /dev/urandom if getrandom() is not supported.

Hans Leidekker hans at codeweavers.com
Tue Mar 16 03:46:48 CDT 2021


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50168
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 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




More information about the wine-devel mailing list