From f3d87d3be121934c297e02822886a0f1d024c78c Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Mon, 5 Jun 2023 11:58:58 -0700 Subject: [PATCH] fasync: release the FileAsync mutex before sending the signal Reported-by: syzbot+dd952ecd2e4147d69edb@syzkaller.appspotmail.com Reported-by: syzbot+d9a2afb847ffabe49fbe@syzkaller.appspotmail.com PiperOrigin-RevId: 537942317 --- pkg/sentry/kernel/fasync/fasync.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkg/sentry/kernel/fasync/fasync.go b/pkg/sentry/kernel/fasync/fasync.go index c8c7e6325..f56281209 100644 --- a/pkg/sentry/kernel/fasync/fasync.go +++ b/pkg/sentry/kernel/fasync/fasync.go @@ -85,12 +85,12 @@ type FileAsync struct { recipientT *kernel.Task } -// NotifyEvent implements waiter.EventListener.NotifyEvent. -func (a *FileAsync) NotifyEvent(mask waiter.EventMask) { +func (a *FileAsync) recipient() *kernel.Task { a.mu.Lock() defer a.mu.Unlock() if !a.registered { - return + // No recipient has been registered. + return nil } t := a.recipientT tg := a.recipientTG @@ -100,8 +100,13 @@ func (a *FileAsync) NotifyEvent(mask waiter.EventMask) { if tg != nil { t = tg.Leader() } + return t +} + +// NotifyEvent implements waiter.EventListener.NotifyEvent. +func (a *FileAsync) NotifyEvent(mask waiter.EventMask) { + t := a.recipient() if t == nil { - // No recipient has been registered. return } c := t.Credentials()