aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Rossi <filipporossi@hey.com>2022-04-04 06:25:32 +0000
committerCherry Mui <cherryyz@google.com>2022-04-05 15:18:32 +0000
commitf92bfa440facc9f31ef70105e3d957a6ca79efb7 (patch)
tree2a6adc72d06b2d4e1dd3f30a5b3e6d1906565530
parentabb3f055246cfda3ca7d4cd2179c636ce207c265 (diff)
downloadgo-f92bfa440facc9f31ef70105e3d957a6ca79efb7.tar.gz
go-f92bfa440facc9f31ef70105e3d957a6ca79efb7.zip
[release-branch.go1.18] cmd/go: prevent panic in go work use
Check if paths passed as arguments are existing directories. Fixes #52140 Updates #51841 Change-Id: Icfd148627e6f2c4651d6f923a37d413e68c67f6c GitHub-Last-Rev: 77fffa7635052f11dc93488ee23fd1c895284b4d GitHub-Pull-Request: golang/go#51845 Reviewed-on: https://go-review.googlesource.com/c/go/+/394154 Trust: Bryan Mills <bcmills@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> Trust: Emmanuel Odeke <emmanuel@orijtech.com> Run-TryBot: Emmanuel Odeke <emmanuel@orijtech.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-on: https://go-review.googlesource.com/c/go/+/397995 Run-TryBot: Bryan Mills <bcmills@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
-rw-r--r--src/cmd/go/internal/workcmd/use.go31
-rw-r--r--src/cmd/go/testdata/script/work_use_file.txt12
-rw-r--r--src/cmd/go/testdata/script/work_use_only_dirs.txt17
3 files changed, 38 insertions, 22 deletions
diff --git a/src/cmd/go/internal/workcmd/use.go b/src/cmd/go/internal/workcmd/use.go
index 07bc9b0500..6da64b3f09 100644
--- a/src/cmd/go/internal/workcmd/use.go
+++ b/src/cmd/go/internal/workcmd/use.go
@@ -12,7 +12,6 @@ import (
"cmd/go/internal/modload"
"cmd/go/internal/str"
"context"
- "errors"
"fmt"
"io/fs"
"os"
@@ -109,17 +108,33 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
base.Fatalf("go: 'go work use' requires one or more directory arguments")
}
for _, useDir := range args {
- if !*useR {
- if target, err := fsys.Stat(useDir); err == nil && !target.IsDir() {
- base.Errorf(`go: argument "%s" is not a directory`, useDir)
+ absArg, _ := pathRel(workDir, useDir)
+
+ info, err := fsys.Stat(absArg)
+ if err != nil {
+ // Errors raised from os.Stat are formatted to be more user-friendly.
+ if os.IsNotExist(err) {
+ base.Errorf("go: directory %v does not exist", absArg)
} else {
- lookDir(useDir)
+ base.Errorf("go: %v", err)
}
continue
+ } else if !info.IsDir() {
+ base.Errorf("go: %s is not a directory", absArg)
+ continue
+ }
+
+ if !*useR {
+ lookDir(useDir)
+ continue
}
// Add or remove entries for any subdirectories that still exist.
- err := fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
+ fsys.Walk(useDir, func(path string, info fs.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+
if !info.IsDir() {
if info.Mode()&fs.ModeSymlink != 0 {
if target, err := fsys.Stat(path); err == nil && target.IsDir() {
@@ -131,13 +146,9 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
lookDir(path)
return nil
})
- if err != nil && !errors.Is(err, os.ErrNotExist) {
- base.Errorf("go: %v", err)
- }
// Remove entries for subdirectories that no longer exist.
// Because they don't exist, they will be skipped by Walk.
- absArg, _ := pathRel(workDir, useDir)
for absDir, _ := range haveDirs {
if str.HasFilePathPrefix(absDir, absArg) {
if _, ok := keepDirs[absDir]; !ok {
diff --git a/src/cmd/go/testdata/script/work_use_file.txt b/src/cmd/go/testdata/script/work_use_file.txt
deleted file mode 100644
index 807dd96c72..0000000000
--- a/src/cmd/go/testdata/script/work_use_file.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-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 --
diff --git a/src/cmd/go/testdata/script/work_use_only_dirs.txt b/src/cmd/go/testdata/script/work_use_only_dirs.txt
new file mode 100644
index 0000000000..aa6dd78a6a
--- /dev/null
+++ b/src/cmd/go/testdata/script/work_use_only_dirs.txt
@@ -0,0 +1,17 @@
+! go work use foo bar baz
+
+stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]foo is not a directory'
+stderr '^go: directory '$WORK'[/\\]gopath[/\\]src[/\\]baz does not exist'
+cmp go.work go.work_want
+
+! go work use -r qux
+stderr '^go: '$WORK'[/\\]gopath[/\\]src[/\\]qux is not a directory'
+
+-- go.work --
+go 1.18
+-- go.work_want --
+go 1.18
+-- foo --
+-- qux --
+-- bar/go.mod --
+module bar \ No newline at end of file