• Austin Clements's avatar
    [release-branch.go1.8] reflect: fix out-of-bounds pointers calling no-result method · 04017ffa
    Austin Clements authored
    reflect.callReflect heap-allocates a stack frame and then constructs
    pointers to the arguments and result areas of that frame. However, if
    there are no results, the results pointer will point past the end of
    the frame allocation. If there are also no arguments, the arguments
    pointer will also point past the end of the frame allocation. If the
    GC observes either these pointers, it may panic.
    
    Fix this by not constructing these pointers if these areas of the
    frame are empty.
    
    This adds a test of calling no-argument/no-result methods via reflect,
    since nothing in std did this before. However, it's quite difficult to
    demonstrate the actual failure because it depends on both exact
    allocation patterns and on GC scanning the goroutine's stack while
    inside one of the typedmemmovepartial calls.
    
    I also audited other uses of typedmemmovepartial and
    memclrNoHeapPointers in reflect, since these are the most susceptible
    to this. These appear to be the only two cases that can construct
    out-of-bounds arguments to these functions.
    
    Fixes #19724.
    Fixes #19768 (backport).
    
    Change-Id: I4b83c596b5625dc4ad0567b1e281bad4faef972b
    Reviewed-on: https://go-review.googlesource.com/39604
    Run-TryBot: Austin Clements <austin@google.com>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    04017ffa
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...