]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.21] cmd/link: don't mangle string symbol names
authorCherry Mui <cherryyz@google.com>
Fri, 18 Aug 2023 15:10:23 +0000 (11:10 -0400)
committerCherry Mui <cherryyz@google.com>
Wed, 23 Aug 2023 17:35:53 +0000 (17:35 +0000)
String symbol names could contain weird characters as we put the
string literal into the symbol name. So it may appear to need
mangling. However, as string symbols are grouped into a single
"go:string.*" symbol, the individual symbol names actually don't
matter. So don't mangle them.

Also make the mangling code more defensive in case of weird
symbol names.

Updates #62098.
Fixes #62140.

Change-Id: I533012567a9fffab69debda934f426421c7abb04
Reviewed-on: https://go-review.googlesource.com/c/go/+/520856
Reviewed-by: Than McIntosh <thanm@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
(cherry picked from commit b65e34f03814889f0edd3ddd9778864762511443)
Reviewed-on: https://go-review.googlesource.com/c/go/+/520857

src/cmd/cgo/internal/testplugin/plugin_test.go
src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go [moved from src/cmd/cgo/internal/testplugin/testdata/generic/plugin.go with 57% similarity]
src/cmd/link/internal/ld/lib.go

index 53ccc17a071c70cf58dd2fd87912801fbb710a18..7652167c25a06f1837ea874ba5092007d4518648 100644 (file)
@@ -389,9 +389,11 @@ func TestForkExec(t *testing.T) {
        }
 }
 
-func TestGeneric(t *testing.T) {
+func TestSymbolNameMangle(t *testing.T) {
        // Issue 58800: generic function name may contain weird characters
        // that confuse the external linker.
+       // Issue 62098: the name mangling code doesn't handle some string
+       // symbols correctly.
        globalSkip(t)
-       goCmd(t, "build", "-buildmode=plugin", "-o", "generic.so", "./generic/plugin.go")
+       goCmd(t, "build", "-buildmode=plugin", "-o", "mangle.so", "./mangle/plugin.go")
 }
similarity index 57%
rename from src/cmd/cgo/internal/testplugin/testdata/generic/plugin.go
rename to src/cmd/cgo/internal/testplugin/testdata/mangle/plugin.go
index 6d3835a7ec5e5b4da8e08a8101429fcd10ba9d01..e1ccb70672cd1506d1be6505ac8aacde73e27921 100644 (file)
@@ -2,21 +2,37 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Instantiated function name may contain weird characters
-// that confuse the external linker, so it needs to be
-// mangled.
+// Test cases for symbol name mangling.
 
 package main
 
-//go:noinline
-func F[T any]() {}
+import (
+       "fmt"
+       "strings"
+)
 
+// Issue 58800:
+// Instantiated function name may contain weird characters
+// that confuse the external linker, so it needs to be
+// mangled.
 type S struct {
        X int `parser:"|@@)"`
 }
 
+//go:noinline
+func F[T any]() {}
+
 func P() {
        F[S]()
 }
 
+// Issue 62098: the name mangling code doesn't handle some string
+// symbols correctly.
+func G(id string) error {
+       if strings.ContainsAny(id, "&$@;/:+,?\\{^}%`]\">[~<#|") {
+               return fmt.Errorf("invalid")
+       }
+       return nil
+}
+
 func main() {}
index 91e2d5149ce4daf3fae9ce910d84ee537dd448f6..d9e5774b6021d1179eae160c8d7c954888323c97 100644 (file)
@@ -992,6 +992,11 @@ func typeSymbolMangle(name string) string {
        if strings.HasPrefix(name, "type:runtime.") {
                return name
        }
+       if strings.HasPrefix(name, "go:string.") {
+               // String symbols will be grouped to a single go:string.* symbol.
+               // No need to mangle individual symbol names.
+               return name
+       }
        if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529
                return name
        }
@@ -1006,7 +1011,7 @@ func typeSymbolMangle(name string) string {
        // instantiated symbol, replace type name in []
        i := strings.IndexByte(name, '[')
        j := strings.LastIndexByte(name, ']')
-       if j == -1 {
+       if j == -1 || j <= i {
                j = len(name)
        }
        hash := notsha256.Sum256([]byte(name[i+1 : j]))