arm64: mmap: Ensure file offset is treated as unsigned
authorBoyang Zhou <zhouby_cn@126.com>
Mon, 29 Apr 2019 14:27:19 +0000 (15:27 +0100)
committerWill Deacon <will.deacon@arm.com>
Mon, 29 Apr 2019 14:27:41 +0000 (15:27 +0100)
The file offset argument to the arm64 sys_mmap() implementation is
scaled from bytes to pages by shifting right by PAGE_SHIFT.
Unfortunately, the offset is passed in as a signed 'off_t' type and
therefore large offsets (i.e. with the top bit set) are incorrectly
sign-extended by the shift. This has been observed to cause false mmap()
failures when mapping GPU doorbells on an arm64 server part.

Change the type of the file offset argument to sys_mmap() from 'off_t'
to 'unsigned long' so that the shifting scales the value as expected.

Cc: <stable@vger.kernel.org>
Signed-off-by: Boyang Zhou <zhouby_cn@126.com>
[will: rewrote commit message]
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/kernel/sys.c

index b44065fb16160c62d3fa113d0a86f1dd1e4564dc..6f91e81165147dd5ef665c292dda6763af5fbabf 100644 (file)
@@ -31,7 +31,7 @@
 
 SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
                unsigned long, prot, unsigned long, flags,
-               unsigned long, fd, off_t, off)
+               unsigned long, fd, unsigned long, off)
 {
        if (offset_in_page(off) != 0)
                return -EINVAL;