mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
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
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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),
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user