Fix signalfd polling.

The signalfd descriptors otherwise always show as available. This can lead
programs to spin, assuming they are looking to see what signals are pending.

Updates #139

PiperOrigin-RevId: 274017890
This commit is contained in:
Adin Scannell 2019-10-10 12:45:34 -07:00 committed by gVisor bot
parent 14952d01fb
commit f8b1859319
2 changed files with 21 additions and 1 deletions

View File

@ -121,7 +121,10 @@ func (s *SignalOperations) Read(ctx context.Context, _ *fs.File, dst usermem.IOS
// Readiness implements waiter.Waitable.Readiness.
func (s *SignalOperations) Readiness(mask waiter.EventMask) waiter.EventMask {
return mask & waiter.EventIn
if mask&waiter.EventIn != 0 && s.target.PendingSignals()&s.Mask() != 0 {
return waiter.EventIn // Pending signals.
}
return 0
}
// EventRegister implements waiter.Waitable.EventRegister.

View File

@ -312,6 +312,23 @@ TEST(Signalfd, KillStillKills) {
EXPECT_EXIT(tgkill(getpid(), gettid(), SIGKILL), KilledBySignal(SIGKILL), "");
}
TEST(Signalfd, Ppoll) {
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGKILL);
FileDescriptor fd =
ASSERT_NO_ERRNO_AND_VALUE(NewSignalFD(&mask, SFD_CLOEXEC));
// Ensure that the given ppoll blocks.
struct pollfd pfd = {};
pfd.fd = fd.get();
pfd.events = POLLIN;
struct timespec timeout = {};
timeout.tv_sec = 1;
EXPECT_THAT(RetryEINTR(ppoll)(&pfd, 1, &timeout, &mask),
SyscallSucceedsWithValue(0));
}
} // namespace
} // namespace testing