• Austin Clements's avatar
    runtime: handle g0 stack overflows gracefully · 78561c4a
    Austin Clements authored
    Currently, if the runtime overflows the g0 stack on Windows, it leads
    to an infinite recursion:
    
    1. Something overflows the g0 stack bounds and calls morestack.
    
    2. morestack determines it's on the g0 stack and hence cannot grow the
    stack, so it calls badmorestackg0 (which prints "fatal: morestack on
    g0") followed by abort.
    
    3. abort performs an INT $3, which turns into a Windows
    _EXCEPTION_BREAKPOINT exception.
    
    4. This enters the Windows sigtramp, which ensures we're on the g0
    stack and calls exceptionhandler.
    
    5. exceptionhandler has a stack check prologue, so it determines that
    it's out of stack and calls morestack.
    
    6. goto 2
    
    Fix this by making the exception handler avoid stack checks until it
    has ruled out an abort and by blowing away the stack bounds in
    lastcontinuehandler before we print the final fatal traceback (which
    itself involves a lot of stack bounds checks).
    
    Fixes #21382.
    
    Change-Id: Ie66e91f708e18d131d97f22b43f9ac26f3aece5a
    Reviewed-on: https://go-review.googlesource.com/120857
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    Reviewed-by: 's avatarAlex Brainman <alex.brainman@gmail.com>
    78561c4a
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...