mirror of
https://github.com/burrowers/garble.git
synced 2025-12-24 12:58:05 +08:00
When updating Garble to support Go 1.22.0, CI on MacOS spotted that the syscall package was failing to build given that it uses assembly code which is only allowed in some std packages. That allowlist is based on import paths, and we were obfuscating the syscall package's import path, so that was breaking GOOS=darwin. As a fix, I added syscall to runtimeAndDeps to not obfuscate it. That wasn't a great fix; it's not part of runtime and its dependencies, and there's no reason we should avoid obfuscating the package contents. Not obfuscating the contents in fact broke x/sys/unix, as it contains a copy of syscall.Rlimit which it type converted with. Undo that fix and reinstate the gogarble.txtar syscall test. Implement the fix where we only leave syscall's import path alone. Add a regression test, and add a note about adding x/net and x/sys to check-third-party.sh so that we can catch these bugs earlier. Fixes #830.
119 lines
1.8 KiB
Plaintext
119 lines
1.8 KiB
Plaintext
exec garble build
|
|
exec ./main
|
|
cmp stdout main.stdout
|
|
|
|
! binsubstr main$exe 'unexportedMethod' 'privateIface'
|
|
|
|
[short] stop # no need to verify this with -short
|
|
|
|
# Check that the program works as expected without garble.
|
|
go build
|
|
exec ./main
|
|
cmp stdout main.stdout
|
|
-- go.mod --
|
|
module test/main
|
|
|
|
go 1.21
|
|
-- main.go --
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"test/main/lib1"
|
|
"test/main/lib2"
|
|
"test/main/lib3"
|
|
)
|
|
|
|
type T string
|
|
|
|
func (t T) String() string {
|
|
return "String method for " + string(t)
|
|
}
|
|
|
|
func (t T) unexportedMethod() string {
|
|
return "unexported method for " + string(t)
|
|
}
|
|
|
|
type privateInterface interface {
|
|
privateIface()
|
|
}
|
|
|
|
func (T) privateIface() {}
|
|
|
|
var _ privateInterface = T("")
|
|
|
|
type StructUnnamed = struct {
|
|
Foo int
|
|
Bar struct {
|
|
Nested *[]string
|
|
}
|
|
Named lib3.Named
|
|
lib3.StructEmbed
|
|
Tagged string // no field tag
|
|
}
|
|
|
|
var _ = lib1.Struct1(lib2.Struct2{})
|
|
|
|
var _ = StructUnnamed(lib2.Struct2{})
|
|
|
|
func main() {
|
|
fmt.Println(T("foo"))
|
|
fmt.Println(T("foo").unexportedMethod())
|
|
}
|
|
|
|
-- main_linux.go --
|
|
package main
|
|
|
|
import "syscall"
|
|
|
|
// golang.org/x/sys/unix has a copy of syscall.Rlimit and converts with it.
|
|
// Note that syscall.Rlimit is only declared in some unix GOOSes.
|
|
type Rlimit2 struct {
|
|
Cur uint64
|
|
Max uint64
|
|
}
|
|
|
|
var _ = (*syscall.Rlimit)(new(Rlimit2))
|
|
|
|
-- lib1/lib1.go --
|
|
package lib1
|
|
|
|
import "test/main/lib3"
|
|
|
|
type Struct1 struct {
|
|
Foo int
|
|
Bar struct {
|
|
Nested *[]string
|
|
}
|
|
Named lib3.Named
|
|
lib3.StructEmbed
|
|
Tagged string `json:"tagged1"`
|
|
}
|
|
|
|
-- lib2/lib2.go --
|
|
package lib2
|
|
|
|
import "test/main/lib3"
|
|
|
|
type Struct2 struct {
|
|
Foo int
|
|
Bar struct {
|
|
Nested *[]string
|
|
}
|
|
Named lib3.Named
|
|
lib3.StructEmbed
|
|
Tagged string `json:"tagged2"`
|
|
}
|
|
-- lib3/lib3.go --
|
|
package lib3
|
|
|
|
type Named int
|
|
|
|
type StructEmbed struct {
|
|
Baz any
|
|
}
|
|
-- main.stdout --
|
|
String method for foo
|
|
unexported method for foo
|