summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/syscalls/linux
diff options
context:
space:
mode:
authorJamie Liu <jamieliu@google.com>2018-09-14 11:09:41 -0700
committerShentubot <shentubot@google.com>2018-09-14 11:10:50 -0700
commit0380bcb3a4125723dc5248f70174ff64fb1942a2 (patch)
tree9f9b9afc0add292aa7d0014062dd3786bb025632 /pkg/sentry/syscalls/linux
parentfaa34a0738456f5328cf99de13622a150042776d (diff)
Fix interaction between rt_sigtimedwait and ignored signals.
PiperOrigin-RevId: 213011782 Change-Id: I716c6ea3c586b0c6c5a892b6390d2d11478bc5af
Diffstat (limited to 'pkg/sentry/syscalls/linux')
-rw-r--r--pkg/sentry/syscalls/linux/sys_signal.go55
1 files changed, 6 insertions, 49 deletions
diff --git a/pkg/sentry/syscalls/linux/sys_signal.go b/pkg/sentry/syscalls/linux/sys_signal.go
index 66ecb1299..ecdec5d3a 100644
--- a/pkg/sentry/syscalls/linux/sys_signal.go
+++ b/pkg/sentry/syscalls/linux/sys_signal.go
@@ -343,44 +343,6 @@ func Pause(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscall
return 0, nil, syserror.ConvertIntr(t.Block(nil), kernel.ERESTARTNOHAND)
}
-func sigtimedwait(t *kernel.Task, mask linux.SignalSet, timeout time.Duration) (*arch.SignalInfo, error) {
- // Is it already pending?
- if info := t.TakeSignal(^mask); info != nil {
- return info, nil
- }
-
- // No signals available immediately and asked not to wait.
- if timeout == 0 {
- return nil, syserror.EAGAIN
- }
-
- // No signals available yet. Temporarily unblock the ones we are interested
- // in then wait for either a timeout or a new signal.
- oldmask := t.SignalMask()
- t.SetSignalMask(oldmask &^ mask)
- _, err := t.BlockWithTimeout(nil, true, timeout)
- t.SetSignalMask(oldmask)
-
- // How did the wait go?
- switch err {
- case syserror.ErrInterrupted:
- if info := t.TakeSignal(^mask); info != nil {
- // Got one of the signals we were waiting for.
- return info, nil
- }
- // Got a signal we weren't waiting for.
- return nil, syserror.EINTR
- case syserror.ETIMEDOUT:
- // Timed out and still no signals.
- return nil, syserror.EAGAIN
- default:
- // Some other error? Shouldn't be possible. The event channel
- // passed to BlockWithTimeout was nil, so the only two ways the
- // block could've ended are a timeout or an interrupt.
- panic("unreachable")
- }
-}
-
// RtSigpending implements linux syscall rt_sigpending(2).
func RtSigpending(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallControl, error) {
addr := args[0].Pointer()
@@ -415,23 +377,18 @@ func RtSigtimedwait(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kerne
timeout = time.Duration(math.MaxInt64)
}
- si, err := sigtimedwait(t, mask, timeout)
+ si, err := t.Sigtimedwait(mask, timeout)
if err != nil {
return 0, nil, err
}
- if si != nil {
- if siginfo != 0 {
- si.FixSignalCodeForUser()
- if _, err := t.CopyOut(siginfo, si); err != nil {
- return 0, nil, err
- }
+ if siginfo != 0 {
+ si.FixSignalCodeForUser()
+ if _, err := t.CopyOut(siginfo, si); err != nil {
+ return 0, nil, err
}
- return uintptr(si.Signo), nil, nil
}
-
- // sigtimedwait's not supposed to return nil si and err...
- return 0, nil, nil
+ return uintptr(si.Signo), nil, nil
}
// RtSigqueueinfo implements linux syscall rt_sigqueueinfo(2).