mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Don't register async handlers for signalfd descriptors
This is a missing part of cl/483861398. PiperOrigin-RevId: 501636729
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user