• 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
.github Loading commit data...
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...