1
0
mirror of https://github.com/golang/go synced 2024-09-24 07:20:14 -06:00

cmd/go: reject relative paths in GOMODCACHE environment

Go already rejects relative paths in a couple environment variables,
It should reject relative paths in GOMODCACHE.

Fixes #43715

Change-Id: Id1ceff839c7ab21c00cf4ace45ce48324733a526
Reviewed-on: https://go-review.googlesource.com/c/go/+/284432
Run-TryBot: Baokun Lee <bk@golangcn.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Trust: Jay Conrod <jayconrod@google.com>
Trust: Baokun Lee <bk@golangcn.org>
This commit is contained in:
Baokun Lee 2021-01-18 14:41:20 +08:00
parent 580636a78a
commit 4c1a7ab49c
5 changed files with 39 additions and 17 deletions

View File

@ -428,7 +428,7 @@ func checkEnvWrite(key, val string) error {
return fmt.Errorf("GOPATH entry is relative; must be absolute path: %q", val) return fmt.Errorf("GOPATH entry is relative; must be absolute path: %q", val)
} }
// Make sure CC and CXX are absolute paths // Make sure CC and CXX are absolute paths
case "CC", "CXX": case "CC", "CXX", "GOMODCACHE":
if !filepath.IsAbs(val) && val != "" && val != filepath.Base(val) { if !filepath.IsAbs(val) && val != "" && val != filepath.Base(val) {
return fmt.Errorf("%s entry is relative; must be absolute path: %q", key, val) return fmt.Errorf("%s entry is relative; must be absolute path: %q", key, val)
} }

View File

@ -28,10 +28,8 @@ import (
) )
func cacheDir(path string) (string, error) { func cacheDir(path string) (string, error) {
if cfg.GOMODCACHE == "" { if err := checkCacheDir(); err != nil {
// modload.Init exits if GOPATH[0] is empty, and cfg.GOMODCACHE return "", err
// is set to GOPATH[0]/pkg/mod if GOMODCACHE is empty, so this should never happen.
return "", fmt.Errorf("internal error: cfg.GOMODCACHE not set")
} }
enc, err := module.EscapePath(path) enc, err := module.EscapePath(path)
if err != nil { if err != nil {
@ -64,10 +62,8 @@ func CachePath(m module.Version, suffix string) (string, error) {
// along with the directory if the directory does not exist or if the directory // along with the directory if the directory does not exist or if the directory
// is not completely populated. // is not completely populated.
func DownloadDir(m module.Version) (string, error) { func DownloadDir(m module.Version) (string, error) {
if cfg.GOMODCACHE == "" { if err := checkCacheDir(); err != nil {
// modload.Init exits if GOPATH[0] is empty, and cfg.GOMODCACHE return "", err
// is set to GOPATH[0]/pkg/mod if GOMODCACHE is empty, so this should never happen.
return "", fmt.Errorf("internal error: cfg.GOMODCACHE not set")
} }
enc, err := module.EscapePath(m.Path) enc, err := module.EscapePath(m.Path)
if err != nil { if err != nil {
@ -134,10 +130,8 @@ func lockVersion(mod module.Version) (unlock func(), err error) {
// user's working directory. // user's working directory.
// If err is nil, the caller MUST eventually call the unlock function. // If err is nil, the caller MUST eventually call the unlock function.
func SideLock() (unlock func(), err error) { func SideLock() (unlock func(), err error) {
if cfg.GOMODCACHE == "" { if err := checkCacheDir(); err != nil {
// modload.Init exits if GOPATH[0] is empty, and cfg.GOMODCACHE base.Fatalf("go: %v", err)
// is set to GOPATH[0]/pkg/mod if GOMODCACHE is empty, so this should never happen.
base.Fatalf("go: internal error: cfg.GOMODCACHE not set")
} }
path := filepath.Join(cfg.GOMODCACHE, "cache", "lock") path := filepath.Join(cfg.GOMODCACHE, "cache", "lock")
@ -633,3 +627,16 @@ func rewriteVersionList(dir string) {
base.Fatalf("go: failed to write version list: %v", err) base.Fatalf("go: failed to write version list: %v", err)
} }
} }
func checkCacheDir() error {
if cfg.GOMODCACHE == "" {
// modload.Init exits if GOPATH[0] is empty, and cfg.GOMODCACHE
// is set to GOPATH[0]/pkg/mod if GOMODCACHE is empty, so this should never happen.
return fmt.Errorf("internal error: cfg.GOMODCACHE not set")
}
if !filepath.IsAbs(cfg.GOMODCACHE) {
return fmt.Errorf("GOMODCACHE entry is relative; must be absolute path: %q.\n", cfg.GOMODCACHE)
}
return nil
}

View File

@ -37,10 +37,8 @@ var downloadCache par.Cache
// local download cache and returns the name of the directory // local download cache and returns the name of the directory
// corresponding to the root of the module's file tree. // corresponding to the root of the module's file tree.
func Download(ctx context.Context, mod module.Version) (dir string, err error) { func Download(ctx context.Context, mod module.Version) (dir string, err error) {
if cfg.GOMODCACHE == "" { if err := checkCacheDir(); err != nil {
// modload.Init exits if GOPATH[0] is empty, and cfg.GOMODCACHE base.Fatalf("go: %v", err)
// is set to GOPATH[0]/pkg/mod if GOMODCACHE is empty, so this should never happen.
base.Fatalf("go: internal error: cfg.GOMODCACHE not set")
} }
// The par.Cache here avoids duplicate work. // The par.Cache here avoids duplicate work.

View File

@ -173,3 +173,9 @@ go env -w GOOS=linux GOARCH=mips
env GOOS=windows env GOOS=windows
! go env -u GOOS ! go env -u GOOS
stderr 'unsupported GOOS/GOARCH.*windows/mips$' stderr 'unsupported GOOS/GOARCH.*windows/mips$'
# go env -w should reject relative paths in GOMODCACHE environment.
! go env -w GOMODCACHE=~/test
stderr 'go env -w: GOMODCACHE entry is relative; must be absolute path: "~/test"'
! go env -w GOMODCACHE=./test
stderr 'go env -w: GOMODCACHE entry is relative; must be absolute path: "./test"'

View File

@ -0,0 +1,11 @@
env GO111MODULE=on
# Go should reject relative paths in GOMODCACHE environment.
env GOMODCACHE="~/test"
! go get example.com/tools/cmd/hello
stderr 'must be absolute path'
env GOMODCACHE="./test"
! go get example.com/tools/cmd/hello
stderr 'must be absolute path'