1
0
mirror of https://github.com/golang/go synced 2024-11-24 09:20:02 -07:00

cmd/go: prevent go work use panic when given a file

The current implementation fails to identify that an argument to go work
use is a file when expecting a directory, and panics when attempting to
access it as a directory. This change checks arguments are directories
and generates an error otherwise.

Fixes #51749

Change-Id: If8f69d233409e93fcf391a8774bace74c031c986
Reviewed-on: https://go-review.googlesource.com/c/go/+/393615
Reviewed-by: Bryan Mills <bcmills@google.com>
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Trust: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
John Anthony 2022-03-17 15:36:52 +00:00 committed by Bryan Mills
parent 31ee4bb28d
commit a84ef50021
2 changed files with 21 additions and 4 deletions

View File

@ -85,13 +85,14 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
lookDir := func(dir string) { lookDir := func(dir string) {
absDir, dir := pathRel(workDir, dir) absDir, dir := pathRel(workDir, dir)
fi, err := os.Stat(filepath.Join(absDir, "go.mod")) fi, err := fsys.Stat(filepath.Join(absDir, "go.mod"))
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
keepDirs[absDir] = "" keepDirs[absDir] = ""
return } else {
base.Errorf("go: %v", err)
} }
base.Errorf("go: %v", err) return
} }
if !fi.Mode().IsRegular() { if !fi.Mode().IsRegular() {
@ -109,7 +110,11 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
} }
for _, useDir := range args { for _, useDir := range args {
if !*useR { if !*useR {
lookDir(useDir) if target, err := fsys.Stat(useDir); err == nil && !target.IsDir() {
base.Errorf(`go: argument "%s" is not a directory`, useDir)
} else {
lookDir(useDir)
}
continue continue
} }

View File

@ -0,0 +1,12 @@
cp go.work go.work.orig
# If an argument to 'go work use' is a file it should be handled gracefully as
# an error and go.work should not be modified
! go work use foo.txt
stderr '^go: argument "foo\.txt" is not a directory$'
cmp go.work go.work.orig
-- go.work --
go 1.18
-- foo.txt --