mirror of
https://github.com/golang/go.git
synced 2024-09-22 02:48:50 +00:00
cmd/go: quote package directory when calling glob
Fixes #53314 Change-Id: I4933b59ee247daec5cf96eb15c52ff54d3ec26a9 Reviewed-on: https://go-review.googlesource.com/c/go/+/411696 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
cad477c922
commit
cb9bf93078
@ -22,6 +22,7 @@ import (
|
|||||||
"cmd/go/internal/lockedfile"
|
"cmd/go/internal/lockedfile"
|
||||||
"cmd/go/internal/modfetch"
|
"cmd/go/internal/modfetch"
|
||||||
"cmd/go/internal/modload"
|
"cmd/go/internal/modload"
|
||||||
|
"cmd/go/internal/str"
|
||||||
"cmd/go/internal/work"
|
"cmd/go/internal/work"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -141,7 +142,7 @@ func runClean(ctx context.Context, cmd *base.Command, args []string) {
|
|||||||
// The top cache directory may have been created with special permissions
|
// The top cache directory may have been created with special permissions
|
||||||
// and not something that we want to remove. Also, we'd like to preserve
|
// and not something that we want to remove. Also, we'd like to preserve
|
||||||
// the access log for future analysis, even if the cache is cleared.
|
// the access log for future analysis, even if the cache is cleared.
|
||||||
subdirs, _ := filepath.Glob(filepath.Join(dir, "[0-9a-f][0-9a-f]"))
|
subdirs, _ := filepath.Glob(filepath.Join(str.QuoteGlob(dir), "[0-9a-f][0-9a-f]"))
|
||||||
printedErrors := false
|
printedErrors := false
|
||||||
if len(subdirs) > 0 {
|
if len(subdirs) > 0 {
|
||||||
if cfg.BuildN || cfg.BuildX {
|
if cfg.BuildN || cfg.BuildX {
|
||||||
|
@ -2063,7 +2063,7 @@ func resolveEmbed(pkgdir string, patterns []string) (files []string, pmap map[st
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Glob to find matches.
|
// Glob to find matches.
|
||||||
match, err := fsys.Glob(pkgdir + string(filepath.Separator) + filepath.FromSlash(glob))
|
match, err := fsys.Glob(str.QuoteGlob(pkgdir) + string(filepath.Separator) + filepath.FromSlash(glob))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ import (
|
|||||||
"cmd/go/internal/lockedfile"
|
"cmd/go/internal/lockedfile"
|
||||||
"cmd/go/internal/par"
|
"cmd/go/internal/par"
|
||||||
"cmd/go/internal/robustio"
|
"cmd/go/internal/robustio"
|
||||||
|
"cmd/go/internal/str"
|
||||||
"cmd/go/internal/trace"
|
"cmd/go/internal/trace"
|
||||||
|
|
||||||
"golang.org/x/mod/module"
|
"golang.org/x/mod/module"
|
||||||
@ -102,7 +103,7 @@ func download(ctx context.Context, mod module.Version) (dir string, err error) {
|
|||||||
// active.
|
// active.
|
||||||
parentDir := filepath.Dir(dir)
|
parentDir := filepath.Dir(dir)
|
||||||
tmpPrefix := filepath.Base(dir) + ".tmp-"
|
tmpPrefix := filepath.Base(dir) + ".tmp-"
|
||||||
if old, err := filepath.Glob(filepath.Join(parentDir, tmpPrefix+"*")); err == nil {
|
if old, err := filepath.Glob(filepath.Join(str.QuoteGlob(parentDir), str.QuoteGlob(tmpPrefix)+"*")); err == nil {
|
||||||
for _, path := range old {
|
for _, path := range old {
|
||||||
RemoveAll(path) // best effort
|
RemoveAll(path) // best effort
|
||||||
}
|
}
|
||||||
@ -224,7 +225,7 @@ func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err e
|
|||||||
// This is only safe to do because the lock file ensures that their
|
// This is only safe to do because the lock file ensures that their
|
||||||
// writers are no longer active.
|
// writers are no longer active.
|
||||||
tmpPattern := filepath.Base(zipfile) + "*.tmp"
|
tmpPattern := filepath.Base(zipfile) + "*.tmp"
|
||||||
if old, err := filepath.Glob(filepath.Join(filepath.Dir(zipfile), tmpPattern)); err == nil {
|
if old, err := filepath.Glob(filepath.Join(str.QuoteGlob(filepath.Dir(zipfile)), tmpPattern)); err == nil {
|
||||||
for _, path := range old {
|
for _, path := range old {
|
||||||
os.Remove(path) // best effort
|
os.Remove(path) // best effort
|
||||||
}
|
}
|
||||||
|
@ -66,3 +66,21 @@ func TrimFilePathPrefix(s, prefix string) string {
|
|||||||
}
|
}
|
||||||
return trimmed[1:]
|
return trimmed[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// QuoteGlob returns s with all Glob metacharacters quoted.
|
||||||
|
// We don't try to handle backslash here, as that can appear in a
|
||||||
|
// file path on Windows.
|
||||||
|
func QuoteGlob(s string) string {
|
||||||
|
if !strings.ContainsAny(s, `*?[]`) {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
var sb strings.Builder
|
||||||
|
for _, c := range s {
|
||||||
|
switch c {
|
||||||
|
case '*', '?', '[', ']':
|
||||||
|
sb.WriteByte('\\')
|
||||||
|
}
|
||||||
|
sb.WriteRune(c)
|
||||||
|
}
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
18
src/cmd/go/testdata/script/embed_brackets.txt
vendored
Normal file
18
src/cmd/go/testdata/script/embed_brackets.txt
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# issue 53314
|
||||||
|
[windows] skip
|
||||||
|
cd [pkg]
|
||||||
|
go build
|
||||||
|
|
||||||
|
-- [pkg]/go.mod --
|
||||||
|
module m
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
-- [pkg]/x.go --
|
||||||
|
package p
|
||||||
|
|
||||||
|
import _ "embed"
|
||||||
|
|
||||||
|
//go:embed t.txt
|
||||||
|
var S string
|
||||||
|
|
||||||
|
-- [pkg]//t.txt --
|
Loading…
Reference in New Issue
Block a user