Fix crash in best_group() (#1891)
authornoobpwnftw <noobpwnftw@users.noreply.github.com>
Sat, 22 Dec 2018 17:05:13 +0000 (01:05 +0800)
committerStéphane Nicolet <cassio@free.fr>
Mon, 24 Dec 2018 10:20:14 +0000 (11:20 +0100)
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

index 2bcc7c1382de2514bf34c200106860824c6da33b..449e07cee9b28530b6c1f646be50043c7a905a33 100644 (file)
@@ -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);
   }