Don't register async handlers for signalfd descriptors

This is a missing part of cl/483861398.

PiperOrigin-RevId: 501636729
This commit is contained in:
Andrei Vagin
2023-01-12 12:32:59 -08:00
committed by gVisor bot
parent 2b208ac832
commit aade3a56b5
2 changed files with 21 additions and 2 deletions
+2 -2
View File
@@ -276,6 +276,7 @@ func (fd *FileDescription) SetStatusFlags(ctx context.Context, creds *auth.Crede
// TODO(gvisor.dev/issue/1035): FileDescriptionImpl.SetOAsync()?
const settableFlags = linux.O_APPEND | linux.O_ASYNC | linux.O_DIRECT | linux.O_NOATIME | linux.O_NONBLOCK
fd.flagsMu.Lock()
defer fd.flagsMu.Unlock()
if fd.asyncHandler != nil {
// Use fd.statusFlags instead of oldFlags, which may have become outdated,
// to avoid double registering/unregistering.
@@ -288,7 +289,6 @@ func (fd *FileDescription) SetStatusFlags(ctx context.Context, creds *auth.Crede
}
}
fd.statusFlags.Store((oldFlags &^ settableFlags) | (flags & settableFlags))
fd.flagsMu.Unlock()
return nil
}
@@ -944,7 +944,7 @@ func (fd *FileDescription) SetAsyncHandler(newHandler func() FileAsync) (FileAsy
if fd.asyncHandler == nil {
fd.asyncHandler = newHandler()
if fd.statusFlags.RacyLoad()&linux.O_ASYNC != 0 {
if err := fd.asyncHandler.Register(fd); err != nil {
if err := fd.impl.RegisterFileAsyncHandler(fd); err != nil {
return nil, err
}
}
+19
View File
@@ -1510,6 +1510,25 @@ TEST_F(FcntlSignalTest, SignalFD) {
syscall(SYS_tkill, tid, SIGIO);
}
TEST_F(FcntlSignalTest, SignalFDSetSigAfterASYNC) {
// Create the signalfd.
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGIO);
FileDescriptor fd = ASSERT_NO_ERRNO_AND_VALUE(NewSignalFD(&mask, 0));
const auto signal_cleanup =
ASSERT_NO_ERRNO_AND_VALUE(RegisterSignalHandler(SIGIO));
ASSERT_THAT(fcntl(fd.get(), F_SETOWN, getpid()), SyscallSucceeds());
int old_flags;
ASSERT_THAT(old_flags = fcntl(fd.get(), F_GETFL), SyscallSucceeds());
ASSERT_THAT(fcntl(fd.get(), F_SETFL, old_flags | O_ASYNC), SyscallSucceeds());
ASSERT_THAT(fcntl(fd.get(), F_SETSIG, 0), SyscallSucceeds());
int tid = syscall(SYS_gettid);
syscall(SYS_tkill, tid, SIGIO);
}
TEST_F(FcntlSignalTest, SetSigCustom) {
const auto signal_cleanup =
ASSERT_NO_ERRNO_AND_VALUE(RegisterSignalHandler(SIGUSR1));