]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: refuse -w with an invalid GO111MODULE
authorDaniel Martí <mvdan@mvdan.cc>
Sun, 13 Oct 2019 21:33:18 +0000 (22:33 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Mon, 14 Oct 2019 22:39:28 +0000 (22:39 +0000)
It was possible to get 'go env' to break itself:

$ go env -w GO111MODULE=bad
$ go env
go: unknown environment setting GO111MODULE=bad

We already check if the variable name is known. In some cases like
GO111MODULE, we also know what the variable's valid values are. Enforce
it when writing the variable, not just when fetching it.

Fixes #34880.

Change-Id: I10d682087c69f3445f314fd4473644f694e255f7
Reviewed-on: https://go-review.googlesource.com/c/go/+/200867
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/envcmd/env.go
src/cmd/go/testdata/script/env_write.txt

index 17852deed1e703a52118539316af10cb859c2629..b80b18164254fdc30ac0e9b5447258321ec29011 100644 (file)
@@ -343,6 +343,18 @@ func checkEnvWrite(key, val string, env []cfg.EnvVar) error {
                return fmt.Errorf("unknown go command variable %s", key)
        }
 
+       // Some variables can only have one of a few valid values. If set to an
+       // invalid value, the next cmd/go invocation might fail immediately,
+       // even 'go env -w' itself.
+       switch key {
+       case "GO111MODULE":
+               switch val {
+               case "", "auto", "on", "off":
+               default:
+                       return fmt.Errorf("invalid %s value %q", key, val)
+               }
+       }
+
        if !utf8.ValidString(val) {
                return fmt.Errorf("invalid UTF-8 in %s=... value", key)
        }
index 695cc83f3d7f9b027880028690106ea6349e3d91..7dbb1d90285a1d9c678fd01dacae443bdfeacf3d 100644 (file)
@@ -85,3 +85,7 @@ stderr 'multiple values for key: GOOS'
 # go env -w rejects missing variables
 ! go env -w GOOS
 stderr 'arguments must be KEY=VALUE: invalid argument: GOOS'
+
+# go env -w rejects invalid GO111MODULE values, as otherwise cmd/go would break
+! go env -w GO111MODULE=badvalue
+stderr 'invalid GO111MODULE value "badvalue"'