diff options
| author | Bryan C. Mills <bcmills@google.com> | 2022-12-15 17:09:00 -0500 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-12-16 03:04:44 +0000 |
| commit | 3323dab1f45bbad1033cdd0c2fbfb9884c5d54cc (patch) | |
| tree | 9625eb1711d90376bbe53530d7fa965de15fa85c /src/os/exec | |
| parent | 628a1e7d3ac8390e0c6327acde1ab52ec09f69d6 (diff) | |
| download | go-3323dab1f45bbad1033cdd0c2fbfb9884c5d54cc.tar.xz | |
os/exec: retry ETXTBSY errors in TestFindExecutableVsNoexec
I made this test parallel in CL 439196, which exposed it to the
fork/exec race condition described in #22315. The ETXTBSY errors from
that race should resolve on their own, so we can simply retry the call
to get past them.
Fixes #56811.
Updates #22315.
Change-Id: I2c6aa405bf3a1769d69cf08bf661a9e7f86440b4
Reviewed-on: https://go-review.googlesource.com/c/go/+/458016
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Auto-Submit: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/os/exec')
| -rw-r--r-- | src/os/exec/lp_linux_test.go | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/os/exec/lp_linux_test.go b/src/os/exec/lp_linux_test.go index 98c3a7b9e0..845573fb14 100644 --- a/src/os/exec/lp_linux_test.go +++ b/src/os/exec/lp_linux_test.go @@ -5,6 +5,7 @@ package exec import ( + "errors" "internal/syscall/unix" "os" "path/filepath" @@ -48,8 +49,20 @@ func TestFindExecutableVsNoexec(t *testing.T) { t.Fatalf("findExecutable: got %v, want nil", err) } - if err := Command(path).Run(); err != nil { - t.Fatalf("exec: got %v, want nil", err) + for { + err = Command(path).Run() + if err == nil { + break + } + if errors.Is(err, syscall.ETXTBSY) { + // A fork+exec in another process may be holding open the FD that we used + // to write the executable (see https://go.dev/issue/22315). + // Since the descriptor should have CLOEXEC set, the problem should resolve + // as soon as the forked child reaches its exec call. + // Keep retrying until that happens. + } else { + t.Fatalf("exec: got %v, want nil", err) + } } // Remount with noexec flag. |
