From 05b3db24c1a48e995ac1f3103a2be9463fac0f96 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 6 Mar 2019 10:39:08 -0800 Subject: [PATCH] reflect: fix StructOf GC programs They are missing a stop byte at the end. Normally this doesn't matter, but when including a GC program in another GC program, we strip the last byte. If that last byte wasn't a stop byte, then we've thrown away part of the program we actually need. Fixes #30606 Change-Id: Ie9604beeb84f7f9442e77d31fe64c374ca132cce Reviewed-on: https://go-review.googlesource.com/c/go/+/165857 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/reflect/type.go | 1 + test/fixedbugs/issue30606.go | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/fixedbugs/issue30606.go diff --git a/src/reflect/type.go b/src/reflect/type.go index 5ce80c61dc..531417ea93 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2712,6 +2712,7 @@ func StructOf(fields []StructField) Type { } } } + prog = append(prog, 0) *(*uint32)(unsafe.Pointer(&prog[0])) = uint32(len(prog) - 4) typ.kind |= kindGCProg typ.gcdata = &prog[0] diff --git a/test/fixedbugs/issue30606.go b/test/fixedbugs/issue30606.go new file mode 100644 index 0000000000..bc31982e10 --- /dev/null +++ b/test/fixedbugs/issue30606.go @@ -0,0 +1,20 @@ +// run + +// Copyright 2019 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 main() {} + +func typ(x interface{}) reflect.Type { return reflect.ValueOf(x).Type() } + +var x = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F5", Type: reflect.StructOf([]reflect.StructField{ + {Name: "F4", Type: reflect.ArrayOf(5462, + reflect.SliceOf(typ(uint64(0))))}, + })}, +})) -- 2.50.0