Commit 97dc5915 authored by Austin Clements's avatar Austin Clements

runtime: avoid stat underflow crash

If the area returned by sysReserve in mheap.sysAlloc is outside the
usable arena, we sysFree it. We pass a fake stat pointer to sysFree
because we haven't added the allocation to any stat at that point.
However, we pass a 0 stat, so sysFree panics when it decrements the
stat because the fake stat underflows.

Fix this by setting the fake stat to the allocation size.

Updates #13143 (this is a prerequisite to fixing that bug).

Change-Id: I61a6c9be19ac1c95863cf6a8435e19790c8bfc9a
Reviewed-on: https://go-review.googlesource.com/16926Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 9b299c1e
...@@ -414,7 +414,10 @@ func (h *mheap) sysAlloc(n uintptr) unsafe.Pointer { ...@@ -414,7 +414,10 @@ func (h *mheap) sysAlloc(n uintptr) unsafe.Pointer {
h.arena_used = used h.arena_used = used
h.arena_reserved = reserved h.arena_reserved = reserved
} else { } else {
var stat uint64 // We haven't added this allocation to
// the stats, so subtract it from a
// fake stat (but avoid underflow).
stat := uint64(p_size)
sysFree(unsafe.Pointer(p), p_size, &stat) sysFree(unsafe.Pointer(p), p_size, &stat)
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment