From: wasertech danny@waser.tech
--- dlls/kernelbase/memory.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index aa83ce85b24..a76d00df111 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -1557,8 +1557,16 @@ static void initialize_numa_info(void) /* Fallback single node if requested or none discovered */ if (numa_force_single || (max_node == 0 && !numa_nodes[0].valid)) { - SYSTEM_INFO si; GetSystemInfo(&si); - numa_nodes[0].cpu_mask = (si.dwNumberOfProcessors >= (sizeof(ULONG_PTR)*8)) ? ~(ULONG_PTR)0 : ((1ULL << si.dwNumberOfProcessors) - 1); + SYSTEM_INFO si; unsigned int cpu_count; + memset(&si, 0, sizeof(si)); /* explicit init to silence static analyzers */ + GetSystemInfo(&si); + cpu_count = si.dwNumberOfProcessors; + if (cpu_count >= sizeof(ULONG_PTR) * 8) + numa_nodes[0].cpu_mask = ~(ULONG_PTR)0; + else if (cpu_count) + numa_nodes[0].cpu_mask = (((ULONG_PTR)1 << cpu_count) - 1); + else /* pathological case: assume at least CPU0 */ + numa_nodes[0].cpu_mask = 1; numa_nodes[0].valid = TRUE; max_node = 0; TRACE_(numa)("NUMA fallback single: mask=0x%llx procs=%u\n", (unsigned long long)numa_nodes[0].cpu_mask, (unsigned)popcount_ulongptr(numa_nodes[0].cpu_mask)); }