diff options
author | Dean Deng <deandeng@google.com> | 2020-08-04 19:10:28 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-08-04 19:12:31 -0700 |
commit | 87ee3898f78cb7d520281ead600036052d6a2049 (patch) | |
tree | 85e12bca4fba70166f7ba41e5ae3544c05e1c196 | |
parent | 102735bfb45820dd840df14827b42744da77c9a0 (diff) |
Handle EOF in vfs2 sendfile.
Discovered by syzkaller.
PiperOrigin-RevId: 324938438
-rw-r--r-- | pkg/sentry/syscalls/linux/vfs2/splice.go | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/pkg/sentry/syscalls/linux/vfs2/splice.go b/pkg/sentry/syscalls/linux/vfs2/splice.go index 16f59fce9..75bfa2c79 100644 --- a/pkg/sentry/syscalls/linux/vfs2/splice.go +++ b/pkg/sentry/syscalls/linux/vfs2/splice.go @@ -347,6 +347,11 @@ func Sendfile(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc } else { spliceN, err = inFile.Read(t, outPipeFD.IOSequence(count), vfs.ReadOptions{}) } + if spliceN == 0 && err == io.EOF { + // We reached the end of the file. Eat the error and exit the loop. + err = nil + break + } n += spliceN if err == syserror.ErrWouldBlock && !nonBlock { err = dw.waitForBoth(t) @@ -367,8 +372,7 @@ func Sendfile(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc readN, err = inFile.Read(t, usermem.BytesIOSequence(buf), vfs.ReadOptions{}) } if readN == 0 && err == io.EOF { - // We reached the end of the file. Eat the - // error and exit the loop. + // We reached the end of the file. Eat the error and exit the loop. err = nil break } |