Commit 96b8f70e authored by David Crawshaw's avatar David Crawshaw

cmd/link: correctly decode name length

The linker was incorrectly decoding type name lengths, causing
typelinks to be sorted out of order and in cases where the name was
the exact right length, linker panics.

Added a test to the reflect package that causes TestTypelinksSorted
to fail before this CL. It's not the exact failure seen in #15448
but it has the same cause: decodetype_name calculating the wrong
length.

The equivalent decoders in reflect/type.go and runtime/type.go
have the parenthesis in the right place.

Fixes #15448

Change-Id: I33257633d812b7d2091393cb9d6cc8a73e0138c8
Reviewed-on: https://go-review.googlesource.com/22403Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarRuss Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 0b6332eb
...@@ -239,7 +239,7 @@ func decodetype_name(s *LSym, off int) string { ...@@ -239,7 +239,7 @@ func decodetype_name(s *LSym, off int) string {
} }
data := r.Sym.P data := r.Sym.P
namelen := int(uint16(data[1]<<8) | uint16(data[2])) namelen := int(uint16(data[1])<<8 | uint16(data[2]))
return string(data[3 : 3+namelen]) return string(data[3 : 3+namelen])
} }
......
...@@ -5651,6 +5651,8 @@ func TestChanAlloc(t *testing.T) { ...@@ -5651,6 +5651,8 @@ func TestChanAlloc(t *testing.T) {
// allocs < 0.5 condition will trigger and this test should be fixed. // allocs < 0.5 condition will trigger and this test should be fixed.
} }
type TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678 int
type nameTest struct { type nameTest struct {
v interface{} v interface{}
want string want string
...@@ -5664,6 +5666,7 @@ var nameTests = []nameTest{ ...@@ -5664,6 +5666,7 @@ var nameTests = []nameTest{
{(func() D1)(nil), ""}, {(func() D1)(nil), ""},
{(<-chan D1)(nil), ""}, {(<-chan D1)(nil), ""},
{(chan<- D1)(nil), ""}, {(chan<- D1)(nil), ""},
{TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678(0), "TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678"},
} }
func TestNames(t *testing.T) { func TestNames(t *testing.T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment