]> Cypherpunks repositories - gostls13.git/commit
runtime: one more Map{Bits,Spans} before arena_used update
authorAustin Clements <austin@google.com>
Mon, 22 Jun 2015 15:18:23 +0000 (11:18 -0400)
committerAustin Clements <austin@google.com>
Mon, 22 Jun 2015 18:54:38 +0000 (18:54 +0000)
commit9a3112bcaeaa4ff81803c1e5dd9ca6932c14f2c1
tree2883c12d914cf072ff5fcf091280af0b667c3145
parent2a331ca8bbadfa20fc1790b04ff90eec23b156e8
runtime: one more Map{Bits,Spans} before arena_used update

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 d57c889 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: Rick Hudson <rlh@golang.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
src/runtime/malloc.go
src/runtime/mheap.go