From 96b79bd3208078835d6a1b9b8c7050554eccc734 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Fri, 2 Jun 2023 08:49:47 -0700 Subject: [PATCH] syscall: don't panic when argv is nil on freebsd The workaround in CL 69970044 introduced a panic when StartProcess is called with empty argv. Check the length before trying to access it. Change-Id: Ic948d86c7067a21c484ba24e100d1f1f80179730 Reviewed-on: https://go-review.googlesource.com/c/go/+/500415 Run-TryBot: Roland Shoemaker TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor --- src/syscall/exec_unix.go | 2 +- src/syscall/exec_unix_test.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go index 4b9c04db83..14edd023d3 100644 --- a/src/syscall/exec_unix.go +++ b/src/syscall/exec_unix.go @@ -165,7 +165,7 @@ func forkExec(argv0 string, argv []string, attr *ProcAttr) (pid int, err error) return 0, err } - if (runtime.GOOS == "freebsd" || runtime.GOOS == "dragonfly") && len(argv[0]) > len(argv0) { + if (runtime.GOOS == "freebsd" || runtime.GOOS == "dragonfly") && len(argv) > 0 && len(argv[0]) > len(argv0) { argvp[0] = argv0p } diff --git a/src/syscall/exec_unix_test.go b/src/syscall/exec_unix_test.go index 2e5e3df374..9627317bb3 100644 --- a/src/syscall/exec_unix_test.go +++ b/src/syscall/exec_unix_test.go @@ -387,3 +387,15 @@ func TestRlimitRestored(t *testing.T) { t.Errorf("exec rlimit = %d, want %d", v, orig) } } + +func TestForkExecNilArgv(t *testing.T) { + defer func() { + if p := recover(); p != nil { + t.Fatal("forkExec panicked") + } + }() + + // We don't really care what the result of forkExec is, just that it doesn't + // panic, so we choose something we know won't actually spawn a process (probably). + syscall.ForkExec("/dev/null", nil, nil) +} -- 2.50.0