Skip to content
  • Simon Marlow's avatar
    do_checks: do not set HpAlloc if the stack check fails · 5c3ea9fb
    Simon Marlow authored
    This fixes a very rare heap corruption bug, whereby
    
     - a context switch is requested, which sets HpLim to zero
       (contextSwitchCapability(), called by the timer signal or
       another Capability).
    
     - simultaneously a stack check fails, in a code fragment that has
       both a stack and a heap check.
    
    The RTS then assumes that a heap-check failure has occurred and
    subtracts HpAlloc from Hp, although in fact it was a stack-check
    failure and retreating Hp will overwrite valid heap objects.  The bug
    is that HpAlloc should only be set when Hp has been incremented by the
    heap check.  See comments in rts/HeapStackCheck.cmm for more details.
    
    This bug is probably incredibly rare in practice, but I happened to be
    working on a test that triggers it reliably:
    concurrent/should_run/throwto001, compiled with -O -threaded, args 30
    300 +RTS -N2, run repeatedly in a loop.
    5c3ea9fb