From 6c65a4ab8e8bc6caa70d3bfe9b4bdd3dc26b8de5 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 3 May 2022 15:14:56 -0400 Subject: [PATCH] [release-branch.go1.18] os/exec: return clear error for missing cmd.Path Following up on CL 403694, there is a bit of confusion about when Path is and isn't set, along with now the exported Err field. Catch the case where Path and Err (and lookPathErr) are all unset and give a helpful error. Updates #52574 Followup after #43724. Fixes #53057 Fixes CVE-2022-30580 Change-Id: I03205172aef3801c3194f5098bdb93290c02b1b6 Reviewed-on: https://go-review.googlesource.com/c/go/+/403759 Reviewed-by: Bryan Mills Reviewed-by: Roland Shoemaker (cherry picked from commit 960ffa98ce73ef2c2060c84c7ac28d37a83f345e) Reviewed-on: https://go-review.googlesource.com/c/go/+/408577 TryBot-Result: Gopher Robot Run-TryBot: Roland Shoemaker --- src/os/exec/exec.go | 3 +++ src/os/exec/exec_test.go | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index 845b737e28fc7..ecddee690de7c 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -374,6 +374,9 @@ func lookExtensions(path, dir string) (string, error) { // The Wait method will return the exit code and release associated resources // once the command exits. func (c *Cmd) Start() error { + if c.Path == "" && c.lookPathErr == nil { + c.lookPathErr = errors.New("exec: no command") + } if c.lookPathErr != nil { c.closeDescriptors(c.closeAfterStart) c.closeDescriptors(c.closeAfterWait) diff --git a/src/os/exec/exec_test.go b/src/os/exec/exec_test.go index 73aa35f1aed1f..1913ae81c8976 100644 --- a/src/os/exec/exec_test.go +++ b/src/os/exec/exec_test.go @@ -1081,3 +1081,11 @@ func TestChildCriticalEnv(t *testing.T) { t.Error("no SYSTEMROOT found") } } + +func TestNoPath(t *testing.T) { + err := new(exec.Cmd).Start() + want := "exec: no command" + if err == nil || err.Error() != want { + t.Errorf("new(Cmd).Start() = %v, want %q", err, want) + } +}