• Austin Clements's avatar
    runtime: one more Map{Bits,Spans} before arena_used update · 9a3112bc
    Austin Clements authored
    In order to avoid a race with a concurrent write barrier or garbage
    collector thread, any update to arena_used must be preceded by mapping
    the corresponding heap bitmap and spans array memory. Otherwise, the
    concurrent access may observe that a pointer falls within the heap
    arena, but then attempt to access unmapped memory to look up its span
    or heap bits.
    
    Commit d57c889a fixed all of the places where we updated arena_used
    immediately before mapping the heap bitmap and spans, but it missed
    the one place where we update arena_used and depend on later code to
    update it again and map the bitmap and spans. This creates a window
    where the original race can still happen. This commit fixes this by
    mapping the heap bitmap and spans before this arena_used update as
    well. This code path is only taken when expanding the heap reservation
    on 32-bit over a hole in the address space, so these extra mmap calls
    should have negligible impact.
    
    Fixes #10212, #11324.
    
    Change-Id: Id67795e6c7563eb551873bc401e5cc997aaa2bd8
    Reviewed-on: https://go-review.googlesource.com/11340
    Run-TryBot: Austin Clements <austin@google.com>
    Reviewed-by: 's avatarRick Hudson <rlh@golang.org>
    Reviewed-by: 's avatarDmitry Vyukov <dvyukov@google.com>
    9a3112bc
malloc.go 28.3 KB