Browse Source

fix: backport libuv patch for failure to load advapi32 (#24039)

* chore: backport advapi32 libuv fix

* Update .patches

* Update patches

Co-authored-by: Samuel Attard <[email protected]>
Co-authored-by: Samuel Attard <[email protected]>
Co-authored-by: Cheng Zhao <[email protected]>
trop[bot] 4 years ago
parent
commit
974be18991

+ 1 - 0
patches/node/.patches

@@ -37,3 +37,4 @@ override_existing_v8_reallocate.patch
 avoid_calling_deprecated_method.patch
 remove_deprecated_wasm_module_type_check.patch
 fix_don_t_preparemainexecution_twice.patch
+win_use_rtlgenrandom_from_advapi32_dll_directly.patch

+ 110 - 0
patches/node/win_use_rtlgenrandom_from_advapi32_dll_directly.patch

@@ -0,0 +1,110 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Samuel Attard <[email protected]>
+Date: Tue, 9 Jun 2020 11:23:55 -0700
+Subject: win: use RtlGenRandom from advapi32.dll directly
+
+At least two people have reported that `LoadLibrary("advapi32.dll")`
+fails in some configurations.
+
+Libuv already links against advapi32.dll so let's sidestep the issue
+by linking to `RtlGenRandom()` directly instead of looking it up at
+runtime.
+
+Fixes: #2759
+PR-URL: #2762
+Reviewed-By: Bartosz Sosnowski <[email protected]>
+Reviewed-By: Colin Ihrig <[email protected]>
+Reviewed-By: Jameson Nash <[email protected]>
+
+Cherry-Pick: https://github.com/libuv/libuv/commit/335e8a6d128646e5a19d39dfc677f5a5a555f7cc
+
+diff --git a/deps/uv/src/win/util.c b/deps/uv/src/win/util.c
+index 4bbeb3154123ddae1bf8c3dc7c684e9de05ad67d..1ba35bf56d4a6906c241a1fddca2e1ba9464909c 100644
+--- a/deps/uv/src/win/util.c
++++ b/deps/uv/src/win/util.c
+@@ -63,6 +63,9 @@
+ /* Maximum environment variable size, including the terminating null */
+ #define MAX_ENV_VAR_LENGTH 32767
+ 
++/* A RtlGenRandom() by any other name... */
++extern BOOLEAN NTAPI SystemFunction036(PVOID Buffer, ULONG BufferLength);
++
+ /* Cached copy of the process title, plus a mutex guarding it. */
+ static char *process_title;
+ static CRITICAL_SECTION process_title_lock;
+@@ -1862,13 +1865,10 @@ int uv_gettimeofday(uv_timeval64_t* tv) {
+ }
+ 
+ int uv__random_rtlgenrandom(void* buf, size_t buflen) {
+-  if (pRtlGenRandom == NULL)
+-    return UV_ENOSYS;
+-
+   if (buflen == 0)
+     return 0;
+ 
+-  if (pRtlGenRandom(buf, buflen) == FALSE)
++  if (SystemFunction036(buf, buflen) == FALSE)
+     return UV_EIO;
+ 
+   return 0;
+diff --git a/deps/uv/src/win/winapi.c b/deps/uv/src/win/winapi.c
+index 85a9de8a2295ec3250f9ae41f5ef6dbe72dc2a8a..bb86ec8ceac8ba3fccd02b292aca7ddfab38e187 100644
+--- a/deps/uv/src/win/winapi.c
++++ b/deps/uv/src/win/winapi.c
+@@ -36,9 +36,6 @@ sNtQueryDirectoryFile pNtQueryDirectoryFile;
+ sNtQuerySystemInformation pNtQuerySystemInformation;
+ sNtQueryInformationProcess pNtQueryInformationProcess;
+ 
+-/* Advapi32 function pointers */
+-sRtlGenRandom pRtlGenRandom;
+-
+ /* Kernel32 function pointers */
+ sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx;
+ 
+@@ -54,7 +51,6 @@ void uv_winapi_init(void) {
+   HMODULE powrprof_module;
+   HMODULE user32_module;
+   HMODULE kernel32_module;
+-  HMODULE advapi32_module;
+ 
+   ntdll_module = GetModuleHandleA("ntdll.dll");
+   if (ntdll_module == NULL) {
+@@ -138,12 +134,4 @@ void uv_winapi_init(void) {
+     pSetWinEventHook = (sSetWinEventHook)
+       GetProcAddress(user32_module, "SetWinEventHook");
+   }
+-
+-  advapi32_module = GetModuleHandleA("advapi32.dll");
+-  if (advapi32_module == NULL) {
+-    uv_fatal_error(GetLastError(), "GetModuleHandleA");
+-  }
+-
+-  pRtlGenRandom =
+-      (sRtlGenRandom) GetProcAddress(advapi32_module, "SystemFunction036");
+ }
+diff --git a/deps/uv/src/win/winapi.h b/deps/uv/src/win/winapi.h
+index fcc70652a9aedb72f92ce78b8ee21cea8933b905..322a212dd73c19378b7abda01c5b60a93cb8e1d5 100644
+--- a/deps/uv/src/win/winapi.h
++++ b/deps/uv/src/win/winapi.h
+@@ -4589,11 +4589,6 @@ typedef NTSTATUS (NTAPI *sNtQueryInformationProcess)
+                   ULONG Length,
+                   PULONG ReturnLength);
+ 
+-/*
+- * Advapi32 headers
+- */
+-typedef BOOLEAN (WINAPI *sRtlGenRandom)(PVOID Buffer, ULONG BufferLength);
+-
+ /*
+  * Kernel32 headers
+  */
+@@ -4736,9 +4731,6 @@ extern sNtQueryDirectoryFile pNtQueryDirectoryFile;
+ extern sNtQuerySystemInformation pNtQuerySystemInformation;
+ extern sNtQueryInformationProcess pNtQueryInformationProcess;
+ 
+-/* Advapi32 function pointers */
+-extern sRtlGenRandom pRtlGenRandom;
+-
+ /* Kernel32 function pointers */
+ extern sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx;
+