From 0194da0d80f35faba08c86e3a6845bdc1268e4c6 Mon Sep 17 00:00:00 2001 From: noobpwnftw Date: Sun, 23 Dec 2018 01:05:13 +0800 Subject: [PATCH] Fix crash in best_group() (#1891) This pull request fixes a rare crashing bug on Windows inside our NUMA code, first reported by Dann Corbit in the following forum thread (thanks!): https://groups.google.com/forum/?fromgroups=#!topic/fishcooking/gA6aoMEuOwg The fix is to not use structure member beyond known size when iterating through 'SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX' structure. We note that the Microsoft API is guaranteed to provide us at least one element upon successful, and no element in the structure can have a zero size. No functional change. --- src/misc.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/misc.cpp b/src/misc.cpp index 2bcc7c13..449e07ce 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -257,7 +257,7 @@ int best_group(size_t idx) { return -1; } - while (ptr->Size > 0 && byteOffset + ptr->Size <= returnLength) + while (byteOffset < returnLength) { if (ptr->Relationship == RelationNumaNode) nodes++; @@ -268,6 +268,7 @@ int best_group(size_t idx) { threads += (ptr->Processor.Flags == LTP_PC_SMT) ? 2 : 1; } + assert(ptr->Size); byteOffset += ptr->Size; ptr = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)(((char*)ptr) + ptr->Size); } -- 2.39.2