]> Cypherpunks.ru repositories - gostls13.git/commitdiff
os/exec: avoid calling LookPath in cmd.Start for resolved paths
authorqiulaidongfeng <2645477756@qq.com>
Tue, 25 Jul 2023 01:19:30 +0000 (01:19 +0000)
committerGopher Robot <gobot@golang.org>
Wed, 26 Jul 2023 11:13:35 +0000 (11:13 +0000)
Follow up on CL 511458, see https://go-review.googlesource.com/c/go/+/511458/2..4/src/cmd/go/main.go#b270 .

For #36768.

Change-Id: Icc2a4dbb1219b1d69dd10a900478957b0e975847

Change-Id: Icc2a4dbb1219b1d69dd10a900478957b0e975847
GitHub-Last-Rev: bac7e66496806d505270c5b90d53672d80a1ca29
GitHub-Pull-Request: golang/go#61517
Reviewed-on: https://go-review.googlesource.com/c/go/+/512155
Auto-Submit: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>

src/os/exec/exec.go
src/os/exec/lp_plan9.go
src/os/exec/lp_unix.go
src/os/exec/lp_wasm.go
src/os/exec/lp_windows.go

index 138be29ecfba6d171aa3d5745dca899e649be4f4..a23d1c4a2d0dbe78f1ed8f754e1bd63c8b05b47a 100644 (file)
@@ -590,32 +590,6 @@ func (c *Cmd) Run() error {
        return c.Wait()
 }
 
-// lookExtensions finds windows executable by its dir and path.
-// It uses LookPath to try appropriate extensions.
-// lookExtensions does not search PATH, instead it converts `prog` into `.\prog`.
-func lookExtensions(path, dir string) (string, error) {
-       if filepath.Base(path) == path {
-               path = "." + string(filepath.Separator) + path
-       }
-       if dir == "" {
-               return LookPath(path)
-       }
-       if filepath.VolumeName(path) != "" {
-               return LookPath(path)
-       }
-       if len(path) > 1 && os.IsPathSeparator(path[0]) {
-               return LookPath(path)
-       }
-       dirandpath := filepath.Join(dir, path)
-       // We assume that LookPath will only add file extension.
-       lp, err := LookPath(dirandpath)
-       if err != nil {
-               return "", err
-       }
-       ext := strings.TrimPrefix(lp, dirandpath)
-       return path + ext, nil
-}
-
 // Start starts the specified command but does not wait for it to complete.
 //
 // If Start returns successfully, the c.Process field will be set.
@@ -649,13 +623,11 @@ func (c *Cmd) Start() error {
                }
                return c.Err
        }
-       if runtime.GOOS == "windows" {
-               lp, err := lookExtensions(c.Path, c.Dir)
-               if err != nil {
-                       return err
-               }
-               c.Path = lp
+       lp, err := lookExtensions(c.Path, c.Dir)
+       if err != nil {
+               return err
        }
+       c.Path = lp
        if c.Cancel != nil && c.ctx == nil {
                return errors.New("exec: command with a non-nil Cancel was not created with CommandContext")
        }
index 9344b14e8cdfe6ffc24955018d7e9235c9c6f9b9..dffdbac35f8e01e0ef2a3c0f4f3a5f1dca2ae019 100644 (file)
@@ -64,3 +64,9 @@ func LookPath(file string) (string, error) {
        }
        return "", &Error{file, ErrNotFound}
 }
+
+// lookExtensions is a no-op on non-Windows platforms, since
+// they do not restrict executables to specific extensions.
+func lookExtensions(path, dir string) (string, error) {
+       return path, nil
+}
index fd2c6efbef08cd8e18774c651159e9be61883bfe..37871320786aef2f36203919273009a39dba8651 100644 (file)
@@ -80,3 +80,9 @@ func LookPath(file string) (string, error) {
        }
        return "", &Error{file, ErrNotFound}
 }
+
+// lookExtensions is a no-op on non-Windows platforms, since
+// they do not restrict executables to specific extensions.
+func lookExtensions(path, dir string) (string, error) {
+       return path, nil
+}
index f2c8e9c5de47903835a4db859f18b70c539017d8..3c819049bab3420e0a04e6b294e406bb557e855f 100644 (file)
@@ -21,3 +21,9 @@ func LookPath(file string) (string, error) {
        // Wasm can not execute processes, so act as if there are no executables at all.
        return "", &Error{file, ErrNotFound}
 }
+
+// lookExtensions is a no-op on non-Windows platforms, since
+// they do not restrict executables to specific extensions.
+func lookExtensions(path, dir string) (string, error) {
+       return path, nil
+}
index 066d38dfdb981b7c0a4972a6100e2950b95cae9f..7f13347c505b7c92b3a53ce48e992ea191c8a4cd 100644 (file)
@@ -63,6 +63,45 @@ func findExecutable(file string, exts []string) (string, error) {
 // As of Go 1.19, LookPath will instead return that path along with an error satisfying
 // errors.Is(err, ErrDot). See the package documentation for more details.
 func LookPath(file string) (string, error) {
+       return lookPath(file, pathExt())
+}
+
+// lookExtensions finds windows executable by its dir and path.
+// It uses LookPath to try appropriate extensions.
+// lookExtensions does not search PATH, instead it converts `prog` into `.\prog`.
+func lookExtensions(path, dir string) (string, error) {
+       if filepath.Base(path) == path {
+               path = "." + string(filepath.Separator) + path
+       }
+       exts := pathExt()
+       if ext := filepath.Ext(path); ext != "" {
+               for _, e := range exts {
+                       if strings.EqualFold(ext, e) {
+                               // Assume that path has already been resolved.
+                               return path, nil
+                       }
+               }
+       }
+       if dir == "" {
+               return lookPath(path, exts)
+       }
+       if filepath.VolumeName(path) != "" {
+               return lookPath(path, exts)
+       }
+       if len(path) > 1 && os.IsPathSeparator(path[0]) {
+               return lookPath(path, exts)
+       }
+       dirandpath := filepath.Join(dir, path)
+       // We assume that LookPath will only add file extension.
+       lp, err := lookPath(dirandpath, exts)
+       if err != nil {
+               return "", err
+       }
+       ext := strings.TrimPrefix(lp, dirandpath)
+       return path + ext, nil
+}
+
+func pathExt() []string {
        var exts []string
        x := os.Getenv(`PATHEXT`)
        if x != "" {
@@ -78,7 +117,11 @@ func LookPath(file string) (string, error) {
        } else {
                exts = []string{".com", ".exe", ".bat", ".cmd"}
        }
+       return exts
+}
 
+// lookPath implements LookPath for the given PATHEXT list.
+func lookPath(file string, exts []string) (string, error) {
        if strings.ContainsAny(file, `:\/`) {
                f, err := findExecutable(file, exts)
                if err == nil {