From 707c808ee35b43801d8a5ad8468ca0eac4a91f13 Mon Sep 17 00:00:00 2001 From: criyle Date: Sat, 2 May 2020 03:03:34 -0400 Subject: [PATCH] retry on ETXTBSY --- go.mod | 2 +- go.sum | 4 ++-- pkg/forkexec/fork_child_linux.go | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9add032..b8e2f6d 100644 --- a/go.mod +++ b/go.mod @@ -4,5 +4,5 @@ go 1.14 require ( github.com/seccomp/libseccomp-golang v0.9.1 - golang.org/x/sys v0.0.0-20200316214734-08c61614bede + golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 ) diff --git a/go.sum b/go.sum index a9967c8..2c2c5d7 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,4 @@ github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -golang.org/x/sys v0.0.0-20200316214734-08c61614bede h1:+jwX0O5IlL7Cj6iam25CdV2pKzCV737/4ewDRGFvwFQ= -golang.org/x/sys v0.0.0-20200316214734-08c61614bede/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= +golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/pkg/forkexec/fork_child_linux.go b/pkg/forkexec/fork_child_linux.go index c12e49f..1c06a41 100644 --- a/pkg/forkexec/fork_child_linux.go +++ b/pkg/forkexec/fork_child_linux.go @@ -438,6 +438,21 @@ func forkAndExecInChild(r *Runner, argv0 *byte, argv, env []*byte, workdir, host uintptr(unsafe.Pointer(&env[0])), 0, 0) } + // for slow devices, the file close is not as quickly as enough and it is causing ETXTBSY, retrying on this error + for err1 == syscall.ETXTBSY { + if r.ExecFile > 0 { + _, _, err1 = syscall.RawSyscall6(unix.SYS_EXECVEAT, r.ExecFile, + uintptr(unsafe.Pointer(&empty[0])), + uintptr(unsafe.Pointer(&argv[0])), + uintptr(unsafe.Pointer(&env[0])), unix.AT_EMPTY_PATH, 0) + } else { + _, _, err1 = syscall.RawSyscall6(unix.SYS_EXECVEAT, uintptr(_AT_FDCWD), + uintptr(unsafe.Pointer(argv0)), + uintptr(unsafe.Pointer(&argv[0])), + uintptr(unsafe.Pointer(&env[0])), 0, 0) + } + } + childerror: // send error code on pipe syscall.RawSyscall(unix.SYS_WRITE, uintptr(pipe), uintptr(unsafe.Pointer(&err1)), unsafe.Sizeof(err1))