diff options
author | Keith Randall <khr@golang.org> | 2020-06-18 12:51:35 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2020-06-19 02:11:35 +0000 |
commit | 3dec253783e1211989102ac6abd34cddbf8ba0e6 (patch) | |
tree | 5cd7c7bfc7210a64b44a50c9ec543db2550bf552 /test | |
parent | a07e28194a05800215efe192d2ff840f339924f0 (diff) | |
download | go-3dec253783e1211989102ac6abd34cddbf8ba0e6.tar.gz go-3dec253783e1211989102ac6abd34cddbf8ba0e6.zip |
reflect: zero stack slots before writing to them with write barriers
reflect.assignTo writes to the target using write barriers. Make sure
that the memory it is writing to is zeroed, so the write barrier does
not read pointers from uninitialized memory.
Fixes #39541
Change-Id: Ia64b2cacc193bffd0c1396bbce1dfb8182d4905b
Reviewed-on: https://go-review.googlesource.com/c/go/+/238760
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/fixedbugs/issue39541.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/test/fixedbugs/issue39541.go b/test/fixedbugs/issue39541.go new file mode 100644 index 0000000000..fba52916eb --- /dev/null +++ b/test/fixedbugs/issue39541.go @@ -0,0 +1,33 @@ +// run + +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "reflect" + +func sub(args []reflect.Value) []reflect.Value { + type A struct { + s int + t int + } + return []reflect.Value{reflect.ValueOf(A{1, 2})} +} + +func main() { + f := reflect.MakeFunc(reflect.TypeOf((func() interface{})(nil)), sub).Interface().(func() interface{}) + c := make(chan bool, 100) + for i := 0; i < 100; i++ { + go func() { + for j := 0; j < 10000; j++ { + f() + } + c <- true + }() + } + for i := 0; i < 100; i++ { + <-c + } +} |