From 3ce203db80cd1f320f0c597123b918c3b3bb0449 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 27 Jan 2022 12:59:37 -0500 Subject: os/exec: return error when PATH lookup would use current directory Following discussion on #43724, change os/exec to take the approach of golang.org/x/sys/execabs, refusing to respect path entries mentioning relative paths by default. Code that insists on being able to find executables in relative directories in the path will need to add a couple lines to override the error. See the updated package docs in exec.go for more details. Fixes #43724. Fixes #43947. Change-Id: I73c1214f322b60b4167a23e956e933d50470fe13 Reviewed-on: https://go-review.googlesource.com/c/go/+/381374 Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills --- src/internal/execabs/execabs_test.go | 103 ----------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 src/internal/execabs/execabs_test.go (limited to 'src/internal/execabs/execabs_test.go') diff --git a/src/internal/execabs/execabs_test.go b/src/internal/execabs/execabs_test.go deleted file mode 100644 index 97a3f39b4a..0000000000 --- a/src/internal/execabs/execabs_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package execabs - -import ( - "context" - "fmt" - "internal/testenv" - "os" - "os/exec" - "path/filepath" - "runtime" - "testing" -) - -func TestFixCmd(t *testing.T) { - cmd := &exec.Cmd{Path: "hello"} - fixCmd("hello", cmd) - if cmd.Path != "" { - t.Error("fixCmd didn't clear cmd.Path") - } - expectedErr := fmt.Sprintf("hello resolves to executable relative to current directory (.%chello)", filepath.Separator) - if err := cmd.Run(); err == nil { - t.Fatal("Command.Run didn't fail") - } else if err.Error() != expectedErr { - t.Fatalf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) - } -} - -func TestCommand(t *testing.T) { - testenv.MustHaveExec(t) - - for _, cmd := range []func(string) *Cmd{ - func(s string) *Cmd { return Command(s) }, - func(s string) *Cmd { return CommandContext(context.Background(), s) }, - } { - tmpDir := t.TempDir() - executable := "execabs-test" - if runtime.GOOS == "windows" { - executable += ".exe" - } - if err := os.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil { - t.Fatalf("os.WriteFile failed: %s", err) - } - cwd, err := os.Getwd() - if err != nil { - t.Fatalf("os.Getwd failed: %s", err) - } - defer os.Chdir(cwd) - if err = os.Chdir(tmpDir); err != nil { - t.Fatalf("os.Chdir failed: %s", err) - } - if runtime.GOOS != "windows" { - // add "." to PATH so that exec.LookPath looks in the current directory on - // non-windows platforms as well - origPath := os.Getenv("PATH") - defer os.Setenv("PATH", origPath) - os.Setenv("PATH", fmt.Sprintf(".:%s", origPath)) - } - expectedErr := fmt.Sprintf("execabs-test resolves to executable relative to 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 { - t.Errorf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) - } - } -} - -func TestLookPath(t *testing.T) { - testenv.MustHaveExec(t) - - tmpDir := t.TempDir() - executable := "execabs-test" - if runtime.GOOS == "windows" { - executable += ".exe" - } - if err := os.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil { - t.Fatalf("os.WriteFile failed: %s", err) - } - cwd, err := os.Getwd() - if err != nil { - t.Fatalf("os.Getwd failed: %s", err) - } - defer os.Chdir(cwd) - if err = os.Chdir(tmpDir); err != nil { - t.Fatalf("os.Chdir failed: %s", err) - } - if runtime.GOOS != "windows" { - // add "." to PATH so that exec.LookPath looks in the current directory on - // non-windows platforms as well - origPath := os.Getenv("PATH") - defer os.Setenv("PATH", origPath) - os.Setenv("PATH", fmt.Sprintf(".:%s", origPath)) - } - expectedErr := fmt.Sprintf("execabs-test resolves to executable relative to current directory (.%c%s)", filepath.Separator, executable) - if _, err := LookPath("execabs-test"); err == nil { - t.Fatalf("LookPath didn't fail when finding a non-relative path") - } else if err.Error() != expectedErr { - t.Errorf("LookPath returned unexpected error: want %q, got %q", expectedErr, err.Error()) - } -} -- cgit v1.3