diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-11-06 20:58:39 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-11-06 20:58:39 +0000 |
commit | d93a73d74bd730a39bacbb4831e366fa0ff8a8b6 (patch) | |
tree | e76380fb59e552baade57d2d170b7e5be9a91880 /pkg/sentry/syscalls/linux/vfs2 | |
parent | de70ee3adac521f19bd9ba9749876911f1a4ff5b (diff) | |
parent | 53eeb06ef14915eee799e9d7d59603ed2a0fe1c1 (diff) |
Merge release-20201030.0-41-g53eeb06ef (automated)
Diffstat (limited to 'pkg/sentry/syscalls/linux/vfs2')
-rw-r--r-- | pkg/sentry/syscalls/linux/vfs2/splice.go | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/pkg/sentry/syscalls/linux/vfs2/splice.go b/pkg/sentry/syscalls/linux/vfs2/splice.go index 035e2a6b0..9ce4f280a 100644 --- a/pkg/sentry/syscalls/linux/vfs2/splice.go +++ b/pkg/sentry/syscalls/linux/vfs2/splice.go @@ -480,18 +480,17 @@ func (dw *dualWaiter) waitForBoth(t *kernel.Task) error { // waitForOut waits for dw.outfile to be read. func (dw *dualWaiter) waitForOut(t *kernel.Task) error { - if dw.outFile.Readiness(eventMaskWrite)&eventMaskWrite == 0 { - if dw.outCh == nil { - dw.outW, dw.outCh = waiter.NewChannelEntry(nil) - dw.outFile.EventRegister(&dw.outW, eventMaskWrite) - // We might be ready now. Try again before blocking. - return nil - } - if err := t.Block(dw.outCh); err != nil { - return err - } - } - return nil + // Don't bother checking readiness of the outFile, because it's not a + // guarantee that it won't return EWOULDBLOCK. Both pipes and eventfds + // can be "ready" but will reject writes of certain sizes with + // EWOULDBLOCK. See b/172075629, b/170743336. + if dw.outCh == nil { + dw.outW, dw.outCh = waiter.NewChannelEntry(nil) + dw.outFile.EventRegister(&dw.outW, eventMaskWrite) + // We might be ready to write now. Try again before blocking. + return nil + } + return t.Block(dw.outCh) } // destroy cleans up resources help by dw. No more calls to wait* can occur |