diff options
author | jsign <jsign.uy@gmail.com> | 2019-11-09 14:41:09 +0000 |
---|---|---|
committer | Bryan C. Mills <bcmills@google.com> | 2019-11-10 13:41:45 +0000 |
commit | 4d4ddd862d26766711d24b91d92cbc4ee2f8b648 (patch) | |
tree | 88523e432352e07480d6403b258bf8e809019631 /src/cmd/go/internal/envcmd/env.go | |
parent | 9eb9c7ba1c047c2463a524ea109c08b2dfbbb574 (diff) | |
download | go-4d4ddd862d26766711d24b91d92cbc4ee2f8b648.tar.gz go-4d4ddd862d26766711d24b91d92cbc4ee2f8b648.zip |
cmd/go: make env -w and -u validate GOOS and GOARCH values
This change makes go env -w and -u check invalid GOOS and GOARCH values and abort if that's the case.
Fixes #34194
Change-Id: Idca8e93bb0b190fd273bf786c925be7993c24a2b
GitHub-Last-Rev: ee67f09d75f4552001cb8b6506bc4af0894c9b05
GitHub-Pull-Request: golang/go#34221
Reviewed-on: https://go-review.googlesource.com/c/go/+/194617
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Diffstat (limited to 'src/cmd/go/internal/envcmd/env.go')
-rw-r--r-- | src/cmd/go/internal/envcmd/env.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index ff4a7e4a46..d2d5ed9507 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -8,6 +8,7 @@ package envcmd import ( "encoding/json" "fmt" + "go/build" "io/ioutil" "os" "path/filepath" @@ -249,6 +250,21 @@ func runEnv(cmd *base.Command, args []string) { fmt.Fprintf(os.Stderr, "warning: go env -w %s=... does not override conflicting OS environment variable\n", key) } } + + goos, okGOOS := add["GOOS"] + goarch, okGOARCH := add["GOARCH"] + if okGOOS || okGOARCH { + if !okGOOS { + goos = cfg.Goos + } + if !okGOARCH { + goarch = cfg.Goarch + } + if err := work.CheckGOOSARCHPair(goos, goarch); err != nil { + base.Fatalf("go env -w: %v", err) + } + } + updateEnvFile(add, nil) return } @@ -265,6 +281,24 @@ func runEnv(cmd *base.Command, args []string) { } del[arg] = true } + if del["GOOS"] || del["GOARCH"] { + goos, goarch := cfg.Goos, cfg.Goarch + if del["GOOS"] { + goos = getOrigEnv("GOOS") + if goos == "" { + goos = build.Default.GOOS + } + } + if del["GOARCH"] { + goarch = getOrigEnv("GOARCH") + if goarch == "" { + goarch = build.Default.GOARCH + } + } + if err := work.CheckGOOSARCHPair(goos, goarch); err != nil { + base.Fatalf("go env -u: %v", err) + } + } updateEnvFile(nil, del) return } @@ -331,6 +365,15 @@ func printEnvAsJSON(env []cfg.EnvVar) { } } +func getOrigEnv(key string) string { + for _, v := range cfg.OrigEnv { + if strings.HasPrefix(v, key+"=") { + return strings.TrimPrefix(v, key+"=") + } + } + return "" +} + func checkEnvWrite(key, val string) error { switch key { case "GOEXE", "GOGCCFLAGS", "GOHOSTARCH", "GOHOSTOS", "GOMOD", "GOTOOLDIR": |