]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.10-security] cmd/go/internal/get: use a strings.Replacer in expand
authorBryan C. Mills <bcmills@google.com>
Tue, 4 Dec 2018 20:42:32 +0000 (15:42 -0500)
committerBryan C. Mills <bcmills@google.com>
Fri, 7 Dec 2018 14:48:05 +0000 (14:48 +0000)
This should be a no-op, but produces deterministic (and more correct)
behavior if we have accidentally failed to sanitize one of the inputs.

Change-Id: I1271d0ffd01a691ec8c84906c4e02d9e2be19c72
Reviewed-on: https://team-review.git.corp.google.com/c/372707
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/cmd/go/internal/get/vcs.go

index 0b2a04e04f81ba472dedcf3058be87831dd7bd09..58d80354161a576e4e075a4ef3b29e454cd18307 100644 (file)
@@ -970,10 +970,14 @@ func matchGoImport(imports []metaImport, importPath string) (metaImport, error)
 
 // expand rewrites s to replace {k} with match[k] for each key k in match.
 func expand(match map[string]string, s string) string {
+       // We want to replace each match exactly once, and the result of expansion
+       // must not depend on the iteration order through the map.
+       // A strings.Replacer has exactly the properties we're looking for.
+       oldNew := make([]string, 0, 2*len(match))
        for k, v := range match {
-               s = strings.Replace(s, "{"+k+"}", v, -1)
+               oldNew = append(oldNew, "{"+k+"}", v)
        }
-       return s
+       return strings.NewReplacer(oldNew...).Replace(s)
 }
 
 // vcsPaths defines the meaning of import paths referring to