• Austin Clements's avatar
    reflect: keep makeFuncImpl live across makeFuncStub · 22689c44
    Austin Clements authored
    When traceback sees reflect.makeFuncStub (or reflect.methodValueCall)
    on the stack, it expects to be able to get the *reflect.makeFuncImpl
    (or *reflect.methodValue) for that call from the first outgoing
    argument slot of makeFuncStub/methodValueCall.
    
    However, currently this object isn't necessarily kept live across
    makeFuncStub. This means it may get garbage collected while in a
    reflect call and reused for something else. If we then try to
    traceback, the runtime will see a corrupted makeFuncImpl object and
    panic. This was not a problem in previous releases because we always
    kept arguments live across the whole function. This became a problem
    when we stopped doing this.
    
    Fix this by using reflect.KeepAlive to keep the
    makeFuncImpl/methodValue live across all of callReflect/callMethod,
    which in turn keeps it live as long as makeFuncStub/methodValueCall
    are on the stack.
    
    Fixes #18635.
    
    Change-Id: I91853efcf17912390fddedfb0230648391c33936
    Reviewed-on: https://go-review.googlesource.com/35151
    Run-TryBot: Austin Clements <austin@google.com>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    22689c44
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...