From 8a1c5b2e486be7a2df7667582a1b8cd53c8c7745 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 18 May 2017 13:59:00 -0400 Subject: [PATCH] runtime: fix stackFromSystem returning memory The stackFromSystem debug mode has two problems: 1) It rounds the stack allocation to _PageSize. If the physical page size is >8K, this can cause unmapping the memory later to either under-unmap or over-unmap. 2) It doesn't return the rounded-up allocation size to its caller, so when we later unmap the memory, we may pass the wrong length. Fix these problems by rounding the size up to the physical page size and putting that rounded-up size in the returned stack bounds. Fixes #17289. Change-Id: I6b854af3b06bb16e3750798397bb5e2a722ec1cb Reviewed-on: https://go-review.googlesource.com/43636 Reviewed-by: Keith Randall --- src/runtime/stack.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 562427a6a2..7860cb183e 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -337,7 +337,8 @@ func stackalloc(n uint32) stack { } if debug.efence != 0 || stackFromSystem != 0 { - v := sysAlloc(round(uintptr(n), _PageSize), &memstats.stacks_sys) + n = uint32(round(uintptr(n), physPageSize)) + v := sysAlloc(uintptr(n), &memstats.stacks_sys) if v == nil { throw("out of memory (stackalloc)") } -- 2.50.0