summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/syscalls/linux
diff options
context:
space:
mode:
authorChanwit Kaewkasi <chanwit@gmail.com>2018-05-22 13:46:52 -0700
committerShentubot <shentubot@google.com>2018-05-22 13:48:14 -0700
commit7b2b7a394601ae477538838702a2c5924da83751 (patch)
tree549f22aeae86a858a8bf4ea78d98a3540e305e26 /pkg/sentry/syscalls/linux
parent705605f9011cfbd58f407ca84bc4c2d8cf39d80b (diff)
Change length type, and let fadvise64 return ESPIPE if file is a pipe
Kernel before 2.6.16 return EINVAL, but later return ESPIPE for this case. Also change type of "length" from Uint(uint32) to Int64. Because C header uses type "size_t" (unsigned long) or "off_t" (long) for length. And it makes more sense to check length < 0 with Int64 because Uint cannot be negative. Change-Id: Ifd7fea2dcded7577a30760558d0d31f479f074c4 PiperOrigin-RevId: 197616743
Diffstat (limited to 'pkg/sentry/syscalls/linux')
-rw-r--r--pkg/sentry/syscalls/linux/sys_file.go7
1 files changed, 6 insertions, 1 deletions
diff --git a/pkg/sentry/syscalls/linux/sys_file.go b/pkg/sentry/syscalls/linux/sys_file.go
index 9b8374ef6..94a876332 100644
--- a/pkg/sentry/syscalls/linux/sys_file.go
+++ b/pkg/sentry/syscalls/linux/sys_file.go
@@ -871,7 +871,7 @@ const (
func Fadvise64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.SyscallControl, error) {
fd := kdefs.FD(args[0].Int())
offset := args[1].Int64()
- length := args[2].Uint()
+ length := args[2].Int64()
advice := args[3].Int()
if offset < 0 || length < 0 {
@@ -884,6 +884,11 @@ func Fadvise64(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sys
}
defer file.DecRef()
+ // If the FD refers to a pipe or FIFO, return error.
+ if fs.IsPipe(file.Dirent.Inode.StableAttr) {
+ return 0, nil, syserror.ESPIPE
+ }
+
switch advice {
case _FADV_NORMAL:
case _FADV_RANDOM: