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:
Arnd Bergmann 2024-06-04 14:20:26 +02:00
parent 5daf62da52
commit 295f10061a
5 changed files with 6 additions and 6 deletions

View File

@ -20,7 +20,7 @@ SYSCALL_DEFINE6(mmap2,
unsigned long, prot, unsigned long, prot,
unsigned long, flags, unsigned long, flags,
unsigned long, fd, unsigned long, fd,
off_t, offset) unsigned long, offset)
{ {
if (unlikely(offset & (~PAGE_MASK >> 12))) if (unlikely(offset & (~PAGE_MASK >> 12)))
return -EINVAL; return -EINVAL;

View File

@ -22,7 +22,7 @@
#define __SYSCALL(nr, call) [nr] = (call), #define __SYSCALL(nr, call) [nr] = (call),
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, unsigned long, 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) if (offset & ~PAGE_MASK)
return -EINVAL; return -EINVAL;

View File

@ -35,7 +35,7 @@
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags, unsigned long, fd, unsigned long, prot, unsigned long, flags, unsigned long, fd,
off_t, pgoff) unsigned long, pgoff)
{ {
if (pgoff & ~PAGE_MASK) if (pgoff & ~PAGE_MASK)
return -EINVAL; return -EINVAL;

View File

@ -23,7 +23,7 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len,
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags, 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); 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) #if defined(CONFIG_32BIT) || defined(CONFIG_COMPAT)
SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len,
unsigned long, prot, unsigned long, flags, 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), * Note that the shift for mmap2 is constant (12),

View File

@ -19,7 +19,7 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
#ifndef sys_mmap #ifndef sys_mmap
asmlinkage long sys_mmap(unsigned long addr, unsigned long len, asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, off_t pgoff); unsigned long fd, unsigned long off);
#endif #endif
#ifndef sys_rt_sigreturn #ifndef sys_rt_sigreturn