summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/syscalls
diff options
context:
space:
mode:
authorFabricio Voznika <fvoznika@google.com>2018-05-15 14:38:32 -0700
committerShentubot <shentubot@google.com>2018-05-15 14:39:20 -0700
commit9889c29d6d26ba86b5e3590eac85bfb8393dd54e (patch)
treec28c99f01a67eab3441e30af8340ec97d107b1c5 /pkg/sentry/syscalls
parent205f1027e6beb84101439172b3c776c2671b5be8 (diff)
Fix problem with sendfile(2) writing less data
When the amount of data read is more than the amount written, sendfile would not adjust 'in file' position and would resume from the wrong location. Closes #33 PiperOrigin-RevId: 196731287 Change-Id: Ia219895dd765016ed9e571fd5b366963c99afb27
Diffstat (limited to 'pkg/sentry/syscalls')
-rw-r--r--pkg/sentry/syscalls/linux/sys_file.go8
1 files changed, 8 insertions, 0 deletions
diff --git a/pkg/sentry/syscalls/linux/sys_file.go b/pkg/sentry/syscalls/linux/sys_file.go
index 5fbacc15e..1d61ac9f0 100644
--- a/pkg/sentry/syscalls/linux/sys_file.go
+++ b/pkg/sentry/syscalls/linux/sys_file.go
@@ -1929,8 +1929,16 @@ func Sendfile(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc
// If we don't have a provided offset.
} else {
// Send data using readv.
+ inOff := inFile.Offset()
r := &io.LimitedReader{R: &fs.FileReader{t, inFile}, N: count}
n, err = io.Copy(w, r)
+ inOff += n
+ if inFile.Offset() != inOff {
+ // Adjust file position in case more bytes were read than written.
+ if _, err := inFile.Seek(t, fs.SeekSet, inOff); err != nil {
+ return 0, nil, syserror.EIO
+ }
+ }
}
// We can only pass a single file to handleIOError, so pick inFile