• Austin Clements's avatar
    runtime: handle sysReserve returning a pointer below the arena · 0de59c27
    Austin Clements authored
    In mheap.sysAlloc, if an allocation at arena_used would exceed
    arena_end (but wouldn't yet push us past arena_start+_MaxArean32), it
    trie to extend the arena reservation by another 256 MB. It extends the
    arena by calling sysReserve, which, on 32-bit, calls mmap without
    MAP_FIXED, which means the address is just a hint and the kernel can
    put the mapping wherever it wants. In particular, mmap may choose an
    address below arena_start (the kernel also chose arena_start, so there
    could be lots of space below it). Currently, we don't detect this case
    and, if it happens, mheap.sysAlloc will corrupt arena_end and
    arena_used then return the low pointer to mheap.grow, which will crash
    when it attempts to index in to h_spans with an underflowed index.
    
    Fix this by checking not only that that p+p_size isn't too high, but
    that p isn't too low.
    
    Fixes #13143.
    
    Change-Id: I8d0f42bd1484460282a83c6f1a6f8f0df7fb2048
    Reviewed-on: https://go-review.googlesource.com/16927
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
    0de59c27
malloc.go 30.1 KB