Skip to content

Commit b65de24

Browse files
author
Filippo Rossi
committed
cmd/go: prevent panic in go work use
Check if paths passed as arguments are existing directories. Fixes golang#51841 golang#51749
1 parent ff6b6c6 commit b65de24

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

src/cmd/go/internal/workcmd/use.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,21 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
109109
base.Fatalf("go: 'go work use' requires one or more directory arguments")
110110
}
111111
for _, useDir := range args {
112+
absArg, _ := pathRel(workDir, useDir)
113+
114+
info, err := os.Stat(absArg)
115+
if err != nil {
116+
if os.IsNotExist(err) {
117+
base.Errorf("go: %v directory not found", absArg)
118+
} else {
119+
base.Errorf("go: %v", err)
120+
}
121+
continue
122+
} else if !info.IsDir() {
123+
base.Errorf("go: %s not a directory", absArg)
124+
continue
125+
}
126+
112127
if !*useR {
113128
if target, err := fsys.Stat(useDir); err == nil && !target.IsDir() {
114129
base.Errorf(`go: argument "%s" is not a directory`, useDir)
@@ -119,7 +134,11 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
119134
}
120135

121136
// Add or remove entries for any subdirectories that still exist.
122-
err := fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
137+
err = fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
138+
if err != nil {
139+
return err
140+
}
141+
123142
if !info.IsDir() {
124143
if info.Mode()&fs.ModeSymlink != 0 {
125144
if target, err := fsys.Stat(path); err == nil && target.IsDir() {
@@ -137,7 +156,6 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
137156

138157
// Remove entries for subdirectories that no longer exist.
139158
// Because they don't exist, they will be skipped by Walk.
140-
absArg, _ := pathRel(workDir, useDir)
141159
for absDir, _ := range haveDirs {
142160
if str.HasFilePathPrefix(absDir, absArg) {
143161
if _, ok := keepDirs[absDir]; !ok {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
! go work use foo bar baz
2+
3+
stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]foo not a directory'
4+
stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]baz directory not found'
5+
cmp go.work go.work_want
6+
7+
! go work use -r qux
8+
stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]qux not a directory'
9+
10+
-- go.work --
11+
go 1.18
12+
-- go.work_want --
13+
go 1.18
14+
-- foo --
15+
-- qux --
16+
-- bar/go.mod --
17+
module bar

0 commit comments

Comments
 (0)