diff --git a/execabs/execabs.go b/execabs/execabs.go index b981cfbb..3bf40fdf 100644 --- a/execabs/execabs.go +++ b/execabs/execabs.go @@ -63,7 +63,7 @@ func LookPath(file string) (string, error) { } func fixCmd(name string, cmd *exec.Cmd) { - if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) { + if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) && !isGo119ErrFieldSet(cmd) { // exec.Command was called with a bare binary name and // exec.LookPath returned a path which is not absolute. // Set cmd.lookPathErr and clear cmd.Path so that it diff --git a/execabs/execabs_go118.go b/execabs/execabs_go118.go index 6ab5f508..2000064a 100644 --- a/execabs/execabs_go118.go +++ b/execabs/execabs_go118.go @@ -7,6 +7,12 @@ package execabs +import "os/exec" + func isGo119ErrDot(err error) bool { return false } + +func isGo119ErrFieldSet(cmd *exec.Cmd) bool { + return false +} diff --git a/execabs/execabs_go119.go b/execabs/execabs_go119.go index 46c5b525..f364b341 100644 --- a/execabs/execabs_go119.go +++ b/execabs/execabs_go119.go @@ -15,3 +15,7 @@ import ( func isGo119ErrDot(err error) bool { return errors.Is(err, exec.ErrDot) } + +func isGo119ErrFieldSet(cmd *exec.Cmd) bool { + return cmd.Err != nil +} diff --git a/execabs/execabs_test.go b/execabs/execabs_test.go index 1e8cf786..cc312f11 100644 --- a/execabs/execabs_test.go +++ b/execabs/execabs_test.go @@ -12,6 +12,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strings" "testing" ) @@ -87,7 +88,7 @@ func TestCommand(t *testing.T) { expectedErr := fmt.Sprintf("execabs-test resolves to executable in current directory (.%c%s)", filepath.Separator, executable) if err = cmd("execabs-test").Run(); err == nil { t.Fatalf("Command.Run didn't fail when exec.LookPath returned a relative path") - } else if err.Error() != expectedErr { + } else if err.Error() != expectedErr && !isGo119ErrDot(err) { t.Errorf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) } } @@ -130,3 +131,14 @@ func TestLookPath(t *testing.T) { t.Errorf("LookPath returned unexpected error: want %q, got %q", expectedErr, err.Error()) } } + +// Issue #58606 +func TestDoesNotExist(t *testing.T) { + err := Command("this-executable-should-not-exist").Start() + if err == nil { + t.Fatal("command should have failed") + } + if strings.Contains(err.Error(), "resolves to executable in current directory") { + t.Errorf("error (%v) should not refer to current directory", err) + } +}