syscalls: mmap(): use unsigned offset type consistently
Most architectures that implement the old-style mmap() with byte offset use 'unsigned long' as the type for that offset, but microblaze and riscv have the off_t type that is shared with userspace, matching the prototype in include/asm-generic/syscalls.h. Make this consistent by using an unsigned argument everywhere. This changes the behavior slightly, as the argument is shifted to a page number, and an user input with the top bit set would result in a negative page offset rather than a large one as we use elsewhere. For riscv, the 32-bit sys_mmap2() definition actually used a custom type that is different from the global declaration, but this was missed due to an incorrect type check. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
5daf62da52
commit
295f10061a
arch
csky/kernel
loongarch/kernel
microblaze/kernel
riscv/kernel
include/asm-generic
@ -20,7 +20,7 @@ SYSCALL_DEFINE6(mmap2,
|
||||
unsigned long, prot,
|
||||
unsigned long, flags,
|
||||
unsigned long, fd,
|
||||
off_t, offset)
|
||||
unsigned long, offset)
|
||||
{
|
||||
if (unlikely(offset & (~PAGE_MASK >> 12)))
|
||||
return -EINVAL;
|
||||
|
@ -22,7 +22,7 @@
|
||||
#define __SYSCALL(nr, call) [nr] = (call),
|
||||
|
||||
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long,
|
||||
prot, unsigned long, flags, unsigned long, fd, off_t, offset)
|
||||
prot, unsigned long, flags, unsigned long, fd, unsigned long, offset)
|
||||
{
|
||||
if (offset & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
@ -35,7 +35,7 @@
|
||||
|
||||
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
|
||||
unsigned long, prot, unsigned long, flags, unsigned long, fd,
|
||||
off_t, pgoff)
|
||||
unsigned long, pgoff)
|
||||
{
|
||||
if (pgoff & ~PAGE_MASK)
|
||||
return -EINVAL;
|
||||
|
@ -23,7 +23,7 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len,
|
||||
#ifdef CONFIG_64BIT
|
||||
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
|
||||
unsigned long, prot, unsigned long, flags,
|
||||
unsigned long, fd, off_t, offset)
|
||||
unsigned long, fd, unsigned long, offset)
|
||||
{
|
||||
return riscv_sys_mmap(addr, len, prot, flags, fd, offset, 0);
|
||||
}
|
||||
@ -32,7 +32,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
|
||||
#if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
|
||||
SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len,
|
||||
unsigned long, prot, unsigned long, flags,
|
||||
unsigned long, fd, off_t, offset)
|
||||
unsigned long, fd, unsigned long, offset)
|
||||
{
|
||||
/*
|
||||
* Note that the shift for mmap2 is constant (12),
|
||||
|
@ -19,7 +19,7 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
#ifndef sys_mmap
|
||||
asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, off_t pgoff);
|
||||
unsigned long fd, unsigned long off);
|
||||
#endif
|
||||
|
||||
#ifndef sys_rt_sigreturn
|
||||
|
Loading…
Reference in New Issue
Block a user