]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: account for guard zone in Windows stack size
authorAustin Clements <austin@google.com>
Fri, 6 Jul 2018 13:55:33 +0000 (09:55 -0400)
committerAustin Clements <austin@google.com>
Sat, 7 Jul 2018 14:44:09 +0000 (14:44 +0000)
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 <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
src/runtime/os_windows.go

index bf5baea13e9ecf5e80edb9a8b8cbe061d959b727..6f73a5ba24a0c6b41b29c8b5384e3bf3f4ec0133 100644 (file)
@@ -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 {