2
0
Эх сурвалжийг харах

+ add more verbose and robust detection of error scenarios to the heap manager

Karoly Balogh 3 долоо хоног өмнө
parent
commit
50732a780e
1 өөрчлөгдсөн 17 нэмэгдсэн , 0 устгасан
  1. 17 0
      rtl/inc/heap.inc

+ 17 - 0
rtl/inc/heap.inc

@@ -794,7 +794,17 @@ type
         writeln(f);
         writeln(f);
         if pVarHeader(p - VarHeaderSize)^.ch.h and LastFlag <> 0 then
         if pVarHeader(p - VarHeaderSize)^.ch.h and LastFlag <> 0 then
           break;
           break;
+        if pVarHeader(p - VarHeaderSize)^.ch.h and VarSizeMask = 0 then
+        begin
+          writeln(f,'ERROR: block size is zero, cannot find the next block!');
+          break;
+        end;
         p := p + pVarHeader(p - VarHeaderSize)^.ch.h and VarSizeMask;
         p := p + pVarHeader(p - VarHeaderSize)^.ch.h and VarSizeMask;
+        if p > ((pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize)) + vOs^.size) then
+        begin
+          writeln(f,'ERROR: previous tail points to ',HexStr(p),' which is outside of this OS chunk!');
+          break;
+        end;
       until false;
       until false;
       needLE := true;
       needLE := true;
       vOs := vOs^.next;
       vOs := vOs^.next;
@@ -1693,6 +1703,13 @@ type
       p := pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize);
       p := pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize);
       repeat
       repeat
         h := pVarHeader(p - VarHeaderSize)^.ch.h;
         h := pVarHeader(p - VarHeaderSize)^.ch.h;
+        { bail out if the next pointer points outside of the allocated OS chunk,
+          or if the size is zero, so the next block would point to ourselves }
+        if (h and VarSizeMask = 0) or
+          ((p + (h and VarSizeMask)) > (pointer(vOs) + (VarOSChunkDataOffset + VarHeaderSize)) + vOs^.size) then
+        begin
+          RunError(203);
+        end;
         if (h and UsedFlag = 0) and (h >= MinSearchableVarHeaderAndPayload) then
         if (h and UsedFlag = 0) and (h >= MinSearchableVarHeaderAndPayload) then
           gs.varFree.Add(p, pFreeVarChunk(p)^.binIndex);
           gs.varFree.Add(p, pFreeVarChunk(p)^.binIndex);
         inc(p, h and VarSizeMask);
         inc(p, h and VarSizeMask);