[GOOS:windows] skip 'filesystem normalizes / to \' [GOOS:plan9] skip 'filesystem disallows \n in paths' # If the directory path containing a package to be built includes a newline, # the go command should refuse to even try to build the package. env DIR=$WORK${/}${newline}'package main'${newline}'func main() { panic("uh-oh")'${newline}'/*' mkdir $DIR cd $DIR exec pwd cp $WORK/go.mod ./go.mod cp $WORK/main.go ./main.go cp $WORK/main_nocgo.go ./main_nocgo.go cp $WORK/main_test.go ./main_test.go ! go build -o $devnull . stderr 'package example: invalid package directory .*uh-oh' [cgo] ! go build -o $devnull main.go [!cgo] ! go build -o $devnull main_nocgo.go stderr 'package command-line-arguments: invalid package directory .*uh-oh' ! go run . stderr 'package example: invalid package directory .*uh-oh' [cgo] ! go run main.go [!cgo] ! go run main_nocgo.go stderr 'package command-line-arguments: invalid package directory .*uh-oh' ! go test . stderr 'package example: invalid package directory .*uh-oh' [cgo] ! go test -v main.go main_test.go [!cgo] ! go test -v main_nocgo.go main_test.go stderr 'package command-line-arguments: invalid package directory .*uh-oh' go list -compiled -e -f '{{with .CompiledGoFiles}}{{.}}{{end}}' . ! stdout . ! stderr . ! exists obj_ # The cgo tool should only accept the source file if the working directory # is not written in line directives in the resulting files. [cgo] ! go tool cgo main.go [cgo] stderr 'cgo: input path contains newline character: .*uh-oh' [cgo] ! exists _obj [cgo] go tool cgo -trimpath=$PWD main.go [cgo] grep '//line main\.go:1:1' _obj/main.cgo1.go [cgo] ! grep 'uh-oh' _obj/main.cgo1.go [cgo] rm _obj # Since we do preserve $PWD (or set it appropriately) for commands, and we do # not resolve symlinks unnecessarily, referring to the contents of the unsafe # directory via a safe symlink should be ok, and should not inject the data from # the symlink target path. [!symlink] stop 'remainder of test checks symlink behavior' [short] stop 'links and runs binaries' symlink $WORK${/}link -> $DIR [cgo] go run $WORK${/}link${/}main.go [!cgo] go run $WORK${/}link${/}main_nocgo.go ! stdout panic ! stderr panic stderr '^ok$' [cgo] go test -v $WORK${/}link${/}main.go $WORK${/}link${/}main_test.go [!cgo] go test -v $WORK${/}link${/}main_nocgo.go $WORK${/}link${/}main_test.go ! stdout panic ! stderr panic stdout '^ok$' # 'go test' combines the test's stdout into stderr cd $WORK/link [cgo] ! go run $DIR${/}main.go [!cgo] ! go run $DIR${/}main_nocgo.go stderr 'package command-line-arguments: invalid package directory .*uh-oh' go run . ! stdout panic ! stderr panic stderr '^ok$' [cgo] go run main.go [!cgo] go run main_nocgo.go ! stdout panic ! stderr panic stderr '^ok$' go test -v ! stdout panic ! stderr panic stdout '^ok$' # 'go test' combines the test's stdout into stderr go test -v . ! stdout panic ! stderr panic stdout '^ok$' # 'go test' combines the test's stdout into stderr [cgo] go tool cgo main.go [cgo] grep '//line .*'${/}'link'${/}'main\.go:1:1' _obj/main.cgo1.go [cgo] ! grep 'uh-oh' _obj/main.cgo1.go -- $WORK/go.mod -- module example go 1.19 -- $WORK/main.go -- package main import "C" func main() { /* nothing here */ println("ok") } -- $WORK/main_nocgo.go -- //go:build !cgo package main func main() { /* nothing here */ println("ok") } -- $WORK/main_test.go -- package main import "testing" func TestMain(*testing.M) { main() }