diff options
author | Dean Deng <deandeng@google.com> | 2020-08-12 13:03:14 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-08-12 13:05:25 -0700 |
commit | c5ed390162930b51719ff45956d7ac1bc963c8e7 (patch) | |
tree | 015911c550d9cd4a9452fd051327a33dcd6591bd /pkg/sentry/syscalls/linux/vfs2/aio.go | |
parent | 776c5f633edc993652bc8e95418729e0420c6324 (diff) |
Release fd references on aio callback cancellation.
Discovered by reference leak checker on tmpfs.inode.
PiperOrigin-RevId: 326294755
Diffstat (limited to 'pkg/sentry/syscalls/linux/vfs2/aio.go')
-rw-r--r-- | pkg/sentry/syscalls/linux/vfs2/aio.go | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/pkg/sentry/syscalls/linux/vfs2/aio.go b/pkg/sentry/syscalls/linux/vfs2/aio.go index 399b4f60c..42559bf69 100644 --- a/pkg/sentry/syscalls/linux/vfs2/aio.go +++ b/pkg/sentry/syscalls/linux/vfs2/aio.go @@ -144,6 +144,12 @@ func submitCallback(t *kernel.Task, id uint64, cb *linux.IOCallback, cbAddr user func getAIOCallback(t *kernel.Task, fd, eventFD *vfs.FileDescription, cbAddr usermem.Addr, cb *linux.IOCallback, ioseq usermem.IOSequence, aioCtx *mm.AIOContext) kernel.AIOCallback { return func(ctx context.Context) { + // Release references after completing the callback. + defer fd.DecRef(ctx) + if eventFD != nil { + defer eventFD.DecRef(ctx) + } + if aioCtx.Dead() { aioCtx.CancelPendingRequest() return @@ -169,8 +175,6 @@ func getAIOCallback(t *kernel.Task, fd, eventFD *vfs.FileDescription, cbAddr use ev.Result = -int64(kernel.ExtractErrno(err, 0)) } - fd.DecRef(ctx) - // Queue the result for delivery. aioCtx.FinishRequest(ev) @@ -179,7 +183,6 @@ func getAIOCallback(t *kernel.Task, fd, eventFD *vfs.FileDescription, cbAddr use // wake up. if eventFD != nil { eventFD.Impl().(*eventfd.EventFileDescription).Signal(1) - eventFD.DecRef(ctx) } } } |