]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: do not append to the global cfg.OrigEnv slice
authorBryan C. Mills <bcmills@google.com>
Thu, 26 Mar 2020 02:24:44 +0000 (22:24 -0400)
committerBryan C. Mills <bcmills@google.com>
Thu, 26 Mar 2020 19:02:17 +0000 (19:02 +0000)
Appending to a global slice is only safe if its length is already
equal to its capacity. That property is not guaranteed for slices in
general, and empirically does not hold for this one.

This is a minimal fix to make it easier to backport.
A more robust cleanup of the base.EnvForDir function will be sent in a
subsequent CL.

Fixes #38077
Updates #37940

Change-Id: I731d5bbd0e516642c2cf43e713eeea15402604e5
Reviewed-on: https://go-review.googlesource.com/c/go/+/225577
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
src/cmd/go/internal/generate/generate.go
src/cmd/go/internal/test/test.go

index 198ca1c1b9486703aebb1c4381b2d9af23e85f13..315db69de8a56b2fb522a39dfd408a61009192f4 100644 (file)
@@ -22,6 +22,7 @@ import (
        "cmd/go/internal/cfg"
        "cmd/go/internal/load"
        "cmd/go/internal/modload"
+       "cmd/go/internal/str"
        "cmd/go/internal/work"
 )
 
@@ -438,7 +439,7 @@ func (g *Generator) exec(words []string) {
        cmd.Stderr = os.Stderr
        // Run the command in the package directory.
        cmd.Dir = g.dir
-       cmd.Env = append(cfg.OrigEnv, g.env...)
+       cmd.Env = str.StringList(cfg.OrigEnv, g.env)
        err := cmd.Run()
        if err != nil {
                g.errorf("running %q: %s", words[0], err)
index dbb899219dc195caa1c0a1888a30f653802ec68b..ec7bde16feabb36b719c0659f011a432c3cb27e5 100644 (file)
@@ -1157,7 +1157,7 @@ func (c *runCache) builderRunTest(b *work.Builder, a *work.Action) error {
 
        cmd := exec.Command(args[0], args[1:]...)
        cmd.Dir = a.Package.Dir
-       cmd.Env = base.EnvForDir(cmd.Dir, cfg.OrigEnv)
+       cmd.Env = base.EnvForDir(cmd.Dir, cfg.OrigEnv[:len(cfg.OrigEnv):len(cfg.OrigEnv)])
        cmd.Stdout = stdout
        cmd.Stderr = stdout