• Austin Clements's avatar
    [release-branch.go1.8] runtime: don't corrupt arena bounds on low mmap · a43c0d2d
    Austin Clements authored
    Cherry-pick of CL 43870.
    
    If mheap.sysAlloc doesn't have room in the heap arena for an
    allocation, it will attempt to map more address space with sysReserve.
    sysReserve is given a hint, but can return any unused address range.
    Currently, mheap.sysAlloc incorrectly assumes the returned region will
    never fall between arena_start and arena_used. If it does,
    mheap.sysAlloc will blindly accept the new region as the new
    arena_used and arena_end, causing these to decrease and make it so any
    Go heap above the new arena_used is no longer considered part of the
    Go heap. This assumption *used to be* safe because we had all memory
    between arena_start and arena_used mapped, but when we switched to an
    arena_start of 0 on 32-bit, it became no longer safe.
    
    Most likely, we've only recently seen this bug occur because we
    usually start arena_used just above the binary, which is low in the
    address space. Hence, the kernel is very unlikely to give us a region
    before arena_used.
    
    Since mheap.sysAlloc is a linear allocator, there's not much we can do
    to handle this well. Hence, we fix this problem by simply rejecting
    the new region if it isn't after arena_end. In this case, we'll take
    the fall-back path and mmap a small region at any address just for the
    requested memory.
    
    Fixes #20259.
    
    Change-Id: Ib72e8cd621545002d595c7cade1e817cfe3e5b1e
    Reviewed-on: https://go-review.googlesource.com/43954
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarChris Broadfoot <cbro@golang.org>
    a43c0d2d
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...