diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-08-24 16:43:51 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-08-24 16:43:51 -0700 |
commit | 18beb67703aa1d7a682bd851894632f2d1a0a730 (patch) | |
tree | 169a42af5fe64e7c2529506d2a05c7d7c7b3bca8 /pkg | |
parent | 0c2b2dc752e626f86454455bd991766ebd68497b (diff) | |
parent | ce4e54186e7c4a59bcdd9a74d89c5d4c2a7174f9 (diff) |
Merge pull request #6438 from gystemd:tcsetpgrp_SIGTTOU
PiperOrigin-RevId: 392774712
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/sentry/kernel/thread_group.go | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/pkg/sentry/kernel/thread_group.go b/pkg/sentry/kernel/thread_group.go index 2eda15303..5814a4eca 100644 --- a/pkg/sentry/kernel/thread_group.go +++ b/pkg/sentry/kernel/thread_group.go @@ -489,11 +489,6 @@ func (tg *ThreadGroup) SetForegroundProcessGroup(tty *TTY, pgid ProcessGroupID) tg.signalHandlers.mu.Lock() defer tg.signalHandlers.mu.Unlock() - // TODO(gvisor.dev/issue/6148): "If tcsetpgrp() is called by a member of a - // background process group in its session, and the calling process is not - // blocking or ignoring SIGTTOU, a SIGTTOU signal is sent to all members of - // this background process group." - // tty must be the controlling terminal. if tg.tty != tty { return -1, linuxerr.ENOTTY @@ -516,6 +511,16 @@ func (tg *ThreadGroup) SetForegroundProcessGroup(tty *TTY, pgid ProcessGroupID) return -1, linuxerr.EPERM } + signalAction := tg.signalHandlers.actions[linux.SIGTTOU] + // If the calling process is a member of a background group, a SIGTTOU + // signal is sent to all members of this background process group. + // We need also need to check whether it is ignoring or blocking SIGTTOU. + ignored := signalAction.Handler == linux.SIG_IGN + blocked := tg.leader.signalMask == linux.SignalSetOf(linux.SIGTTOU) + if tg.processGroup.id != tg.processGroup.session.foreground.id && !ignored && !blocked { + tg.leader.sendSignalLocked(SignalInfoPriv(linux.SIGTTOU), true) + } + tg.processGroup.session.foreground.id = pgid return 0, nil } |