Module: wine Branch: master Commit: ec02224941eedf16b8b043964519f6363b5ce21f URL: https://source.winehq.org/git/wine.git/?a=commit;h=ec02224941eedf16b8b043964...
Author: Hans Leidekker hans@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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