]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: correctly decode name length
authorDavid Crawshaw <crawshaw@golang.org>
Tue, 26 Apr 2016 14:53:25 +0000 (10:53 -0400)
committerDavid Crawshaw <crawshaw@golang.org>
Tue, 26 Apr 2016 15:55:06 +0000 (15:55 +0000)
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/22403
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/link/internal/ld/decodesym.go
src/reflect/all_test.go

index 3ec488bbe8da0fd23e367aecc5a47cc33d338363..551ff802d7fb69c910e4b31795c30a5c6d7b9bab 100644 (file)
@@ -239,7 +239,7 @@ func decodetype_name(s *LSym, off int) string {
        }
 
        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])
 }
 
index e88bc880e2eccd2b62567bf01e886a7c0f3b21d2..aff8ea253b90cea18069b03b65e3cc1b770b143e 100644 (file)
@@ -5651,6 +5651,8 @@ func TestChanAlloc(t *testing.T) {
        // allocs < 0.5 condition will trigger and this test should be fixed.
 }
 
+type TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678 int
+
 type nameTest struct {
        v    interface{}
        want string
@@ -5664,6 +5666,7 @@ var nameTests = []nameTest{
        {(func() 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) {