From: Austin Clements Date: Fri, 6 Jul 2018 13:55:33 +0000 (-0400) Subject: runtime: account for guard zone in Windows stack size X-Git-Tag: go1.11beta2~194 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d6b56bb301470c62634d1747cc155489c4e0f18a;p=gostls13.git runtime: account for guard zone in Windows stack size Windows includes an 8K guard in system-allocated thread stacks, which we currently don't account for when setting the g0 stack bounds. As a result, if we do overflow the g0 stack bounds, we'll get a STATUS_GUARD_PAGE_VIOLATION exception, which we're not expecting. Fix the g0 stack bounds to include a total of 16K of slop to account for this 8K guard. Updates #21382. Change-Id: Ia89b741b1413328e4681a237f5a7ee645531fe16 Reviewed-on: https://go-review.googlesource.com/122516 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Alex Brainman --- diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index bf5baea13e..6f73a5ba24 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -698,10 +698,12 @@ func minit() { print("runtime: VirtualQuery failed; errno=", getlasterror(), "\n") throw("VirtualQuery for stack base failed") } - // Add 8K of slop for calling C functions that don't have - // stack checks. We shouldn't be anywhere near this bound - // anyway. - base := mbi.allocationBase + 8*1024 + // The system leaves an 8K PAGE_GUARD region at the bottom of + // the stack (in theory VirtualQuery isn't supposed to include + // that, but it does). Add an additional 8K of slop for + // calling C functions that don't have stack checks. We + // shouldn't be anywhere near this bound anyway. + base := mbi.allocationBase + 16<<10 // Sanity check the stack bounds. g0 := getg() if base > g0.stack.hi || g0.stack.hi-base > 64<<20 {