diff options
-rw-r--r-- | src/random.c | 2 | ||||
-rw-r--r-- | src/win/fs.c | 2 | ||||
-rw-r--r-- | src/win/internal.h | 2 | ||||
-rw-r--r-- | src/win/udp.c | 7 | ||||
-rw-r--r-- | src/win/util.c | 12 | ||||
-rw-r--r-- | src/win/winapi.c | 13 | ||||
-rw-r--r-- | src/win/winapi.h | 5 | ||||
-rw-r--r-- | test/run-benchmarks.c | 2 | ||||
-rw-r--r-- | test/run-tests.c | 2 | ||||
-rw-r--r-- | test/runner-win.c | 2 | ||||
-rw-r--r-- | test/task.h | 50 | ||||
-rw-r--r-- | test/test-tcp-close-accept.c | 4 |
12 files changed, 74 insertions, 29 deletions
diff --git a/src/random.c b/src/random.c index 57fc0d91..402678cb 100644 --- a/src/random.c +++ b/src/random.c @@ -61,7 +61,7 @@ static int uv__random(void* buf, size_t buflen) { # endif #elif defined(_WIN32) uv__once_init(); - rc = uv__random_rtlgenrandom(buf, buflen); + rc = uv__random_winrandom(buf, buflen); #else rc = uv__random_devurandom(buf, buflen); #endif diff --git a/src/win/fs.c b/src/win/fs.c index 4e156930..acaa5689 100644 --- a/src/win/fs.c +++ b/src/win/fs.c @@ -1269,7 +1269,7 @@ void fs__mktemp(uv_fs_t* req, uv__fs_mktemp_func func) { tries = TMP_MAX; do { - if (uv__random_rtlgenrandom((void *)&v, sizeof(v)) < 0) { + if (uv__random_winrandom(&v, sizeof(v)) < 0) { SET_REQ_UV_ERROR(req, UV_EIO, ERROR_IO_DEVICE); goto clobber; } diff --git a/src/win/internal.h b/src/win/internal.h index be408af6..db488be7 100644 --- a/src/win/internal.h +++ b/src/win/internal.h @@ -269,7 +269,7 @@ int uv__getsockpeername(const uv_handle_t* handle, int* namelen, int delayed_error); -int uv__random_rtlgenrandom(void* buf, size_t buflen); +int uv__random_winrandom(void* buf, size_t buflen); /* diff --git a/src/win/udp.c b/src/win/udp.c index e0873c2a..f8aa2435 100644 --- a/src/win/udp.c +++ b/src/win/udp.c @@ -1149,10 +1149,13 @@ int uv__udp_try_send2(uv_udp_t* handle, uv_buf_t* bufs[/*count*/], unsigned int nbufs[/*count*/], struct sockaddr* addrs[/*count*/]) { - unsigned int i; + int i; int r; - for (i = 0; i < count; i++) { + if (count > INT_MAX) + return UV_EINVAL; + + for (i = 0; i < (int) count; i++) { r = uv_udp_try_send(handle, bufs[i], nbufs[i], addrs[i]); if (r < 0) return i > 0 ? i : r; /* Error if first packet, else send count. */ diff --git a/src/win/util.c b/src/win/util.c index 8c2681fe..9e3daac8 100644 --- a/src/win/util.c +++ b/src/win/util.c @@ -513,8 +513,8 @@ int uv_uptime(double* uptime) { unsigned int uv_available_parallelism(void) { DWORD_PTR procmask; DWORD_PTR sysmask; - int count; - int i; + unsigned count; + unsigned i; /* TODO(bnoordhuis) Use GetLogicalProcessorInformationEx() to support systems * with > 64 CPUs? See https://github.com/libuv/libuv/pull/3458 @@ -1712,6 +1712,9 @@ int uv_os_uname(uv_utsname_t* buffer) { case PROCESSOR_ARCHITECTURE_ARM: uv__strscpy(buffer->machine, "arm", sizeof(buffer->machine)); break; + case PROCESSOR_ARCHITECTURE_ARM64: + uv__strscpy(buffer->machine, "arm64", sizeof(buffer->machine)); + break; default: uv__strscpy(buffer->machine, "unknown", sizeof(buffer->machine)); break; @@ -1744,10 +1747,13 @@ int uv_gettimeofday(uv_timeval64_t* tv) { return 0; } -int uv__random_rtlgenrandom(void* buf, size_t buflen) { +int uv__random_winrandom(void* buf, size_t buflen) { if (buflen == 0) return 0; + if (pProcessPrng != NULL && pProcessPrng(buf, buflen)) + return 0; + if (SystemFunction036(buf, buflen) == FALSE) return UV_EIO; diff --git a/src/win/winapi.c b/src/win/winapi.c index 758164f6..7ed08dd2 100644 --- a/src/win/winapi.c +++ b/src/win/winapi.c @@ -39,6 +39,9 @@ sNtQueryInformationProcess pNtQueryInformationProcess; /* Powrprof.dll function pointer */ sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; +/* bcryptprimitives.dll function pointer */ +sProcessPrng pProcessPrng; + /* User32.dll function pointer */ sSetWinEventHook pSetWinEventHook; @@ -53,6 +56,7 @@ void uv__winapi_init(void) { HMODULE powrprof_module; HMODULE user32_module; HMODULE ws2_32_module; + HMODULE bcryptprimitives_module; HMODULE api_win_core_file_module; union { @@ -67,6 +71,7 @@ void uv__winapi_init(void) { sNtQuerySystemInformation pNtQuerySystemInformation; sNtQueryInformationProcess pNtQueryInformationProcess; sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; + sProcessPrng pProcessPrng; sSetWinEventHook pSetWinEventHook; uv_sGetHostNameW pGetHostNameW; sGetFileInformationByName pGetFileInformationByName; @@ -138,6 +143,14 @@ void uv__winapi_init(void) { u.pPowerRegisterSuspendResumeNotification; } + bcryptprimitives_module = LoadLibraryExA("bcryptprimitives.dll", + NULL, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (bcryptprimitives_module != NULL) { + u.proc = GetProcAddress(bcryptprimitives_module, "ProcessPrng"); + pProcessPrng = u.pProcessPrng; + } + user32_module = GetModuleHandleW(L"user32.dll"); if (user32_module != NULL) { u.proc = GetProcAddress(user32_module, "SetWinEventHook"); diff --git a/src/win/winapi.h b/src/win/winapi.h index b9c9f1ab..a7e1b179 100644 --- a/src/win/winapi.h +++ b/src/win/winapi.h @@ -4751,6 +4751,8 @@ typedef DWORD (WINAPI *sPowerRegisterSuspendResumeNotification) HANDLE Recipient, _PHPOWERNOTIFY RegistrationHandle); +typedef BOOL (WINAPI *sProcessPrng)(/*_Out_*/PBYTE pbData, SIZE_T cbData); + /* from Winuser.h */ typedef VOID (CALLBACK* WINEVENTPROC) (HWINEVENTHOOK hWinEventHook, @@ -4815,6 +4817,9 @@ extern sNtQueryInformationProcess pNtQueryInformationProcess; /* Powrprof.dll function pointer */ extern sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; +/* bcryptprimitives.dll function pointer */ +extern sProcessPrng pProcessPrng; + /* User32.dll function pointer */ extern sSetWinEventHook pSetWinEventHook; diff --git a/test/run-benchmarks.c b/test/run-benchmarks.c index 2b343da4..d7290f96 100644 --- a/test/run-benchmarks.c +++ b/test/run-benchmarks.c @@ -31,7 +31,7 @@ #ifdef __MVS__ #include "zos-base.h" /* Initialize environment and zoslib */ -__attribute__((constructor)) void init() { +__attribute__((constructor)) void init(void) { zoslib_config_t config; init_zoslib_config(&config); init_zoslib(config); diff --git a/test/run-tests.c b/test/run-tests.c index a5007e24..51170749 100644 --- a/test/run-tests.c +++ b/test/run-tests.c @@ -40,7 +40,7 @@ #ifdef __MVS__ #include "zos-base.h" /* Initialize environment and zoslib */ -__attribute__((constructor)) void init() { +__attribute__((constructor)) void init(void) { zoslib_config_t config; init_zoslib_config(&config); init_zoslib(config); diff --git a/test/runner-win.c b/test/runner-win.c index 8035ca62..52e0f64d 100644 --- a/test/runner-win.c +++ b/test/runner-win.c @@ -340,7 +340,7 @@ static int clear_line(void) { } -void rewind_cursor() { +void rewind_cursor(void) { if (clear_line() == -1) { /* If clear_line fails (stdout is not a console), print a newline. */ fprintf(stderr, "\n"); diff --git a/test/task.h b/test/task.h index d3eeaf77..2600da5e 100644 --- a/test/task.h +++ b/test/task.h @@ -113,8 +113,8 @@ typedef enum { #define ASSERT_BASE(a, operator, b, type, conv) \ do { \ - volatile type eval_a = (type) (a); \ - volatile type eval_b = (type) (b); \ + type const eval_a = (a); \ + type const eval_b = (b); \ if (!(eval_a operator eval_b)) { \ fprintf(stderr, \ "Assertion failed in %s on line %d: `%s %s %s` " \ @@ -131,6 +131,21 @@ typedef enum { } \ } while (0) +#define ASSERT_OK(a) \ + do { \ + int64_t const eval_a = (a); \ + if (eval_a) { \ + fprintf(stderr, \ + "Assertion failed in %s on line %d: `%s` okay " \ + "(error: %"PRId64")\n", \ + __FILE__, \ + __LINE__, \ + #a, \ + eval_a); \ + abort(); \ + } \ + } while (0) + #define ASSERT_BASE_STR(expr, a, operator, b, type, conv) \ do { \ if (!(expr)) { \ @@ -173,8 +188,8 @@ typedef enum { do { \ if (!(expr)) { \ int i; \ - unsigned char* a_ = (unsigned char*)a; \ - unsigned char* b_ = (unsigned char*)b; \ + const unsigned char* a_ = (a); \ + const unsigned char* b_ = (b); \ fprintf(stderr, \ "Assertion failed in %s on line %d: `%s %s %s` (", \ __FILE__, \ @@ -202,7 +217,6 @@ typedef enum { #define ASSERT_LE(a, b) ASSERT_BASE(a, <=, b, int64_t, PRId64) #define ASSERT_LT(a, b) ASSERT_BASE(a, <, b, int64_t, PRId64) #define ASSERT_NE(a, b) ASSERT_BASE(a, !=, b, int64_t, PRId64) -#define ASSERT_OK(a) ASSERT_BASE(a, ==, 0, int64_t, PRId64) #define ASSERT_UINT64_EQ(a, b) ASSERT_BASE(a, ==, b, uint64_t, PRIu64) #define ASSERT_UINT64_GE(a, b) ASSERT_BASE(a, >=, b, uint64_t, PRIu64) @@ -211,12 +225,12 @@ typedef enum { #define ASSERT_UINT64_LT(a, b) ASSERT_BASE(a, <, b, uint64_t, PRIu64) #define ASSERT_UINT64_NE(a, b) ASSERT_BASE(a, !=, b, uint64_t, PRIu64) -#define ASSERT_DOUBLE_EQ(a, b) ASSERT_BASE(a, ==, b, double, "f") -#define ASSERT_DOUBLE_GE(a, b) ASSERT_BASE(a, >=, b, double, "f") -#define ASSERT_DOUBLE_GT(a, b) ASSERT_BASE(a, >, b, double, "f") -#define ASSERT_DOUBLE_LE(a, b) ASSERT_BASE(a, <=, b, double, "f") -#define ASSERT_DOUBLE_LT(a, b) ASSERT_BASE(a, <, b, double, "f") -#define ASSERT_DOUBLE_NE(a, b) ASSERT_BASE(a, !=, b, double, "f") +#define ASSERT_DOUBLE_EQ(a, b) ASSERT_BASE(a, ==, b, volatile double, "f") +#define ASSERT_DOUBLE_GE(a, b) ASSERT_BASE(a, >=, b, volatile double, "f") +#define ASSERT_DOUBLE_GT(a, b) ASSERT_BASE(a, >, b, volatile double, "f") +#define ASSERT_DOUBLE_LE(a, b) ASSERT_BASE(a, <=, b, volatile double, "f") +#define ASSERT_DOUBLE_LT(a, b) ASSERT_BASE(a, <, b, volatile double, "f") +#define ASSERT_DOUBLE_NE(a, b) ASSERT_BASE(a, !=, b, volatile double, "f") #define ASSERT_STR_EQ(a, b) \ ASSERT_BASE_STR(strcmp(a, b) == 0, a, == , b, char*, "s") @@ -237,19 +251,23 @@ typedef enum { ASSERT_BASE_HEX(memcmp(a, b, size) != 0, a, !=, b, size) #define ASSERT_NULL(a) \ - ASSERT_BASE(a, ==, NULL, void*, "p") + ASSERT_BASE(a, ==, NULL, const void*, "p") #define ASSERT_NOT_NULL(a) \ - ASSERT_BASE(a, !=, NULL, void*, "p") + ASSERT_BASE(a, !=, NULL, const void*, "p") #define ASSERT_PTR_EQ(a, b) \ - ASSERT_BASE(a, ==, b, void*, "p") + ASSERT_BASE(a, ==, b, const void*, "p") #define ASSERT_PTR_NE(a, b) \ - ASSERT_BASE(a, !=, b, void*, "p") + ASSERT_BASE(a, !=, b, const void*, "p") #define ASSERT_PTR_LT(a, b) \ - ASSERT_BASE(a, <, b, void*, "p") + ASSERT_BASE(a, <, b, const void*, "p") +#define ASSERT_PTR_LE(a, b) \ + ASSERT_BASE(a, <=, b, const void*, "p") +#define ASSERT_PTR_GE(a, b) \ + ASSERT_BASE(a, >=, b, const void*, "p") /* This macro cleans up the event loop. This is used to avoid valgrind * warnings about memory being "leaked" by the event loop. diff --git a/test/test-tcp-close-accept.c b/test/test-tcp-close-accept.c index 4988dd13..30e1f1fa 100644 --- a/test/test-tcp-close-accept.c +++ b/test/test-tcp-close-accept.c @@ -69,8 +69,8 @@ static void connect_cb(uv_connect_t* req, int status) { } ASSERT_OK(status); - ASSERT_LE(connect_reqs, req); - ASSERT_LE(req, connect_reqs + ARRAY_SIZE(connect_reqs)); + ASSERT_PTR_LE(connect_reqs, req); + ASSERT_PTR_LE(req, connect_reqs + ARRAY_SIZE(connect_reqs)); i = req - connect_reqs; buf = uv_buf_init("x", 1); |