diff options
author | Chanwit Kaewkasi <chanwit@gmail.com> | 2018-05-22 13:46:52 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-05-22 13:48:14 -0700 |
commit | 7b2b7a394601ae477538838702a2c5924da83751 (patch) | |
tree | 549f22aeae86a858a8bf4ea78d98a3540e305e26 | |
parent | 705605f9011cfbd58f407ca84bc4c2d8cf39d80b (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
-rw-r--r-- | pkg/sentry/syscalls/linux/sys_file.go | 7 |
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: |