From 7b2b7a394601ae477538838702a2c5924da83751 Mon Sep 17 00:00:00 2001 From: Chanwit Kaewkasi Date: Tue, 22 May 2018 13:46:52 -0700 Subject: [PATCH] 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 --- pkg/sentry/syscalls/linux/sys_file.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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: