Hans Leidekker : ntdll: Return buffer filled with random values from NtQuerySystemInformation(SystemInterruptInformation).

Alexandre Julliard julliard at winehq.org
Wed Sep 9 15:42:28 CDT 2020


Module: wine
Branch: master
Commit: ec02224941eedf16b8b043964519f6363b5ce21f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ec02224941eedf16b8b043964519f6363b5ce21f

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Mon Sep  7 14:10:12 2020 +0200

ntdll: Return buffer filled with random values from NtQuerySystemInformation(SystemInterruptInformation).

Based on a patch by Sebastian Lackner.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 configure                |  2 ++
 configure.ac             |  2 ++
 dlls/ntdll/tests/info.c  |  3 ++-
 dlls/ntdll/unix/system.c | 34 +++++++++++++++++++++++++++++-----
 include/config.h.in      |  6 ++++++
 5 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/configure b/configure
index 5da5e9e713..8d68b2e4cf 100755
--- a/configure
+++ b/configure
@@ -7486,6 +7486,7 @@ for ac_header in \
 	sys/protosw.h \
 	sys/ptrace.h \
 	sys/queue.h \
+	sys/random.h \
 	sys/resource.h \
 	sys/scsiio.h \
 	sys/shm.h \
@@ -17877,6 +17878,7 @@ for ac_func in \
 	getauxval \
 	getifaddrs \
 	getopt_long_only \
+	getrandom \
 	kqueue \
 	lstat \
 	mach_continuous_time \
diff --git a/configure.ac b/configure.ac
index 08d0af0ec1..123dea0f5f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -514,6 +514,7 @@ AC_CHECK_HEADERS(\
 	sys/protosw.h \
 	sys/ptrace.h \
 	sys/queue.h \
+	sys/random.h \
 	sys/resource.h \
 	sys/scsiio.h \
 	sys/shm.h \
@@ -2181,6 +2182,7 @@ AC_CHECK_FUNCS(\
 	getauxval \
 	getifaddrs \
 	getopt_long_only \
+	getrandom \
 	kqueue \
 	lstat \
 	mach_continuous_time \
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c
index 057b855914..b09c57b97a 100644
--- a/dlls/ntdll/tests/info.c
+++ b/dlls/ntdll/tests/info.c
@@ -643,7 +643,8 @@ static void test_query_interrupt(void)
     sii = HeapAlloc(GetProcessHeap(), 0, NeededLength);
 
     status = pNtQuerySystemInformation(SystemInterruptInformation, sii, 0, &ReturnLength);
-    ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+    ok(status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08x\n", status);
+    ok(ReturnLength == NeededLength, "got %u\n", ReturnLength);
 
     /* Try it for all processors */
     status = pNtQuerySystemInformation(SystemInterruptInformation, sii, NeededLength, &ReturnLength);
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c
index c2412643af..ccbc68b972 100644
--- a/dlls/ntdll/unix/system.c
+++ b/dlls/ntdll/unix/system.c
@@ -29,6 +29,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <errno.h>
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
 #endif
@@ -42,6 +43,9 @@
 #ifdef HAVE_MACHINE_CPU_H
 # include <machine/cpu.h>
 #endif
+#ifdef HAVE_SYS_RANDOM_H
+# include <sys/random.h>
+#endif
 #ifdef HAVE_IOKIT_IOKITLIB_H
 # include <CoreFoundation/CoreFoundation.h>
 # include <IOKit/IOKitLib.h>
@@ -2422,16 +2426,36 @@ NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS class,
 
     case SystemInterruptInformation:
     {
-        SYSTEM_INTERRUPT_INFORMATION sii = {{ 0 }};
-
-        len = sizeof(sii);
+        len = NtCurrentTeb()->Peb->NumberOfProcessors * sizeof(SYSTEM_INTERRUPT_INFORMATION);
         if (size >= len)
         {
             if (!info) ret = STATUS_ACCESS_VIOLATION;
-            else memcpy( info, &sii, len);
+            else
+            {
+#ifdef HAVE_GETRANDOM
+                int ret;
+                do
+                {
+                    ret = getrandom( info, len, 0 );
+                }
+                while (ret == -1 && errno == EINTR);
+#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" );
+#endif
+            }
         }
         else ret = STATUS_INFO_LENGTH_MISMATCH;
-        FIXME("info_class SYSTEM_INTERRUPT_INFORMATION\n");
         break;
     }
 
diff --git a/include/config.h.in b/include/config.h.in
index 5a21875f66..4309920ffa 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -252,6 +252,9 @@
 /* Define to 1 if you have the `getopt_long_only' function. */
 #undef HAVE_GETOPT_LONG_ONLY
 
+/* Define to 1 if you have the `getrandom' function. */
+#undef HAVE_GETRANDOM
+
 /* Define to 1 if you have the `getservbyport' function. */
 #undef HAVE_GETSERVBYPORT
 
@@ -1061,6 +1064,9 @@
 /* Define to 1 if you have the <sys/queue.h> header file. */
 #undef HAVE_SYS_QUEUE_H
 
+/* Define to 1 if you have the <sys/random.h> header file. */
+#undef HAVE_SYS_RANDOM_H
+
 /* Define to 1 if you have the <sys/resource.h> header file. */
 #undef HAVE_SYS_RESOURCE_H
 




More information about the wine-cvs mailing list