1
0
mirror of https://github.com/golang/go synced 2024-11-11 17:51:49 -07:00

[release-branch.go1.17] 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 #53056
Fixes CVE-2022-30580

Change-Id: I03205172aef3801c3194f5098bdb93290c02b1b6
Reviewed-on: https://go-review.googlesource.com/c/go/+/403759
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Roland Shoemaker <roland@golang.org>
(cherry picked from commit 960ffa98ce)
Reviewed-on: https://go-review.googlesource.com/c/go/+/408578
Run-TryBot: Roland Shoemaker <roland@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Russ Cox 2022-05-03 15:14:56 -04:00 committed by Alex Rakoczy
parent 2be03d789d
commit 590b53fac9
2 changed files with 11 additions and 0 deletions

View File

@ -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)

View File

@ -1156,3 +1156,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)
}
}