diff options
author | Bryan C. Mills <bcmills@google.com> | 2019-04-03 09:45:48 -0400 |
---|---|---|
committer | Bryan C. Mills <bcmills@google.com> | 2019-04-03 14:46:58 +0000 |
commit | 17436af8413071a50515c90af69c23f77cb201e3 (patch) | |
tree | 5f9413286bfc123f6700d9b9bd8cde0dcefca34e /src/cmd/go/internal/modload/load.go | |
parent | 94507d2213fbd0a5e3b5276904f41c6bc0e03aba (diff) | |
download | go-17436af8413071a50515c90af69c23f77cb201e3.tar.gz go-17436af8413071a50515c90af69c23f77cb201e3.zip |
cmd/go/internal/modload: fix aliasing bug in (*mvsReqs).Required with -mod=vendor
(*mvsReqs).Required assumes that it is safe to mutate the slice
returned by (*mvsReqs).required. In most cases, that was true, but in
the case of -mod=vendor it resulted in unsynchronized (and
potentially interfering) writes to the global vendorList.
Fixes #30550
Change-Id: I99bcc2037e0182418b7dfda1002f8b540dbf3a1d
Reviewed-on: https://go-review.googlesource.com/c/go/+/170598
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/cmd/go/internal/modload/load.go')
-rw-r--r-- | src/cmd/go/internal/modload/load.go | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index d55e0c5403..ea0ac6771f 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -976,27 +976,27 @@ func readVendorList() { } func (r *mvsReqs) modFileToList(f *modfile.File) []module.Version { - var list []module.Version + list := make([]module.Version, 0, len(f.Require)) for _, r := range f.Require { list = append(list, r.Mod) } return list } +// required returns a unique copy of the requirements of mod. func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { if mod == Target { if modFile != nil && modFile.Go != nil { r.versions.LoadOrStore(mod, modFile.Go.Version) } - var list []module.Version - return append(list, r.buildList[1:]...), nil + return append([]module.Version(nil), r.buildList[1:]...), nil } if cfg.BuildMod == "vendor" { // For every module other than the target, // return the full list of modules from modules.txt. readVendorList() - return vendorList, nil + return append([]module.Version(nil), vendorList...), nil } if targetInGorootSrc { |