]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.18] cmd/go: prevent go work use panic when given a file
authorJohn Anthony <johnanthony.contrib@gmail.com>
Thu, 17 Mar 2022 15:36:52 +0000 (15:36 +0000)
committerCherry Mui <cherryyz@google.com>
Tue, 5 Apr 2022 14:17:24 +0000 (14:17 +0000)
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 #51764
Updates #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>
(cherry picked from commit a84ef500213ef6c2a0e4bfd82253e9fcd28f1f62)
Reviewed-on: https://go-review.googlesource.com/c/go/+/397994
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/go/internal/workcmd/use.go
src/cmd/go/testdata/script/work_use_file.txt [new file with mode: 0644]

index e20041f79f1376d54be4f4ac369b108d893384e4..07bc9b05009b3f75eb9175a6c5535922edad0e13 100644 (file)
@@ -85,13 +85,14 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
        lookDir := func(dir string) {
                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 os.IsNotExist(err) {
                                keepDirs[absDir] = ""
-                               return
+                       } else {
+                               base.Errorf("go: %v", err)
                        }
-                       base.Errorf("go: %v", err)
+                       return
                }
 
                if !fi.Mode().IsRegular() {
@@ -109,7 +110,11 @@ func runUse(ctx context.Context, cmd *base.Command, args []string) {
        }
        for _, useDir := range args {
                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
                }
 
diff --git a/src/cmd/go/testdata/script/work_use_file.txt b/src/cmd/go/testdata/script/work_use_file.txt
new file mode 100644 (file)
index 0000000..807dd96
--- /dev/null
@@ -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 --