fix compat truncate/ftruncate

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2013-02-24 13:49:08 -05:00
parent 561c673197
commit 3f6d078d4a
11 changed files with 29 additions and 35 deletions

View file

@ -113,8 +113,8 @@ __SYSCALL(88, sys_reboot)
__SYSCALL(89, sys_ni_syscall) /* 89 was sys_readdir */ __SYSCALL(89, sys_ni_syscall) /* 89 was sys_readdir */
__SYSCALL(90, sys_ni_syscall) /* 90 was sys_mmap */ __SYSCALL(90, sys_ni_syscall) /* 90 was sys_mmap */
__SYSCALL(91, sys_munmap) __SYSCALL(91, sys_munmap)
__SYSCALL(92, sys_truncate) __SYSCALL(92, compat_sys_truncate)
__SYSCALL(93, sys_ftruncate) __SYSCALL(93, compat_sys_ftruncate)
__SYSCALL(94, sys_fchmod) __SYSCALL(94, sys_fchmod)
__SYSCALL(95, sys_fchown16) __SYSCALL(95, sys_fchown16)
__SYSCALL(96, sys_getpriority) __SYSCALL(96, sys_getpriority)

View file

@ -284,8 +284,8 @@ sys_call_table:
PTR compat_sys_old_readdir PTR compat_sys_old_readdir
PTR sys_mips_mmap /* 4090 */ PTR sys_mips_mmap /* 4090 */
PTR sys_munmap PTR sys_munmap
PTR sys_truncate PTR compat_sys_truncate
PTR sys_ftruncate PTR compat_sys_ftruncate
PTR sys_fchmod PTR sys_fchmod
PTR sys_fchown /* 4095 */ PTR sys_fchown /* 4095 */
PTR sys_getpriority PTR sys_getpriority

View file

@ -165,8 +165,8 @@
ENTRY_SAME(mmap2) ENTRY_SAME(mmap2)
ENTRY_SAME(mmap) /* 90 */ ENTRY_SAME(mmap) /* 90 */
ENTRY_SAME(munmap) ENTRY_SAME(munmap)
ENTRY_SAME(truncate) ENTRY_COMP(truncate)
ENTRY_SAME(ftruncate) ENTRY_COMP(ftruncate)
ENTRY_SAME(fchmod) ENTRY_SAME(fchmod)
ENTRY_SAME(fchown) /* 95 */ ENTRY_SAME(fchown) /* 95 */
ENTRY_SAME(getpriority) ENTRY_SAME(getpriority)

View file

@ -146,18 +146,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd,
(off_t __user *)offset, count); (off_t __user *)offset, count);
} }
long compat_sys_truncate(const char __user * path, u32 length)
{
/* sign extend length */
return sys_truncate(path, (int)length);
}
long compat_sys_ftruncate(int fd, u32 length)
{
/* sign extend length */
return sys_ftruncate(fd, (int)length);
}
unsigned long compat_sys_mmap2(unsigned long addr, size_t len, unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
unsigned long prot, unsigned long flags, unsigned long prot, unsigned long flags,
unsigned long fd, unsigned long pgoff) unsigned long fd, unsigned long pgoff)

View file

@ -325,16 +325,6 @@ ENTRY(sys32_munmap_wrapper)
llgfr %r3,%r3 # size_t llgfr %r3,%r3 # size_t
jg sys_munmap # branch to system call jg sys_munmap # branch to system call
ENTRY(sys32_truncate_wrapper)
llgtr %r2,%r2 # const char *
lgfr %r3,%r3 # long
jg sys_truncate # branch to system call
ENTRY(sys32_ftruncate_wrapper)
llgfr %r2,%r2 # unsigned int
llgfr %r3,%r3 # unsigned long
jg sys_ftruncate # branch to system call
ENTRY(sys32_fchmod_wrapper) ENTRY(sys32_fchmod_wrapper)
llgfr %r2,%r2 # unsigned int llgfr %r2,%r2 # unsigned int
llgfr %r3,%r3 # mode_t llgfr %r3,%r3 # mode_t

View file

@ -100,8 +100,8 @@ SYSCALL(sys_reboot,sys_reboot,sys32_reboot_wrapper)
SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper) /* old readdir syscall */ SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper) /* old readdir syscall */
SYSCALL(sys_old_mmap,sys_old_mmap,old32_mmap_wrapper) /* 90 */ SYSCALL(sys_old_mmap,sys_old_mmap,old32_mmap_wrapper) /* 90 */
SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper) SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper)
SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper) SYSCALL(sys_truncate,sys_truncate,compat_sys_truncate)
SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper) SYSCALL(sys_ftruncate,sys_ftruncate,compat_sys_ftruncate)
SYSCALL(sys_fchmod,sys_fchmod,sys32_fchmod_wrapper) SYSCALL(sys_fchmod,sys_fchmod,sys32_fchmod_wrapper)
SYSCALL(sys_fchown16,sys_ni_syscall,sys32_fchown16_wrapper) /* 95 old fchown16 syscall*/ SYSCALL(sys_fchown16,sys_ni_syscall,sys32_fchown16_wrapper) /* 95 old fchown16 syscall*/
SYSCALL(sys_getpriority,sys_getpriority,sys32_getpriority_wrapper) SYSCALL(sys_getpriority,sys_getpriority,sys32_getpriority_wrapper)

View file

@ -52,7 +52,6 @@ SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
SIGN1(sys32_truncate, sys_truncate, %o1)
.globl sys32_mmap2 .globl sys32_mmap2
sys32_mmap2: sys32_mmap2:

View file

@ -43,8 +43,8 @@ sys_call_table32:
/*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
.word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd .word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
/*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod /*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod
.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
/*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall /*130*/ .word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
.word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 .word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
/*140*/ .word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit /*140*/ .word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
.word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write

View file

@ -98,8 +98,8 @@
89 i386 readdir sys_old_readdir compat_sys_old_readdir 89 i386 readdir sys_old_readdir compat_sys_old_readdir
90 i386 mmap sys_old_mmap sys32_mmap 90 i386 mmap sys_old_mmap sys32_mmap
91 i386 munmap sys_munmap 91 i386 munmap sys_munmap
92 i386 truncate sys_truncate 92 i386 truncate sys_truncate compat_sys_truncate
93 i386 ftruncate sys_ftruncate 93 i386 ftruncate sys_ftruncate compat_sys_ftruncate
94 i386 fchmod sys_fchmod 94 i386 fchmod sys_fchmod
95 i386 fchown sys_fchown16 95 i386 fchown sys_fchown16
96 i386 getpriority sys_getpriority 96 i386 getpriority sys_getpriority

View file

@ -30,6 +30,7 @@
#include <linux/fs_struct.h> #include <linux/fs_struct.h>
#include <linux/ima.h> #include <linux/ima.h>
#include <linux/dnotify.h> #include <linux/dnotify.h>
#include <linux/compat.h>
#include "internal.h" #include "internal.h"
@ -140,6 +141,13 @@ SYSCALL_DEFINE2(truncate, const char __user *, path, long, length)
return do_sys_truncate(path, length); return do_sys_truncate(path, length);
} }
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length)
{
return do_sys_truncate(path, length);
}
#endif
static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) static long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
{ {
struct inode *inode; struct inode *inode;
@ -195,6 +203,13 @@ SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
return ret; return ret;
} }
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(ftruncate, unsigned int, fd, compat_ulong_t, length)
{
return do_sys_ftruncate(fd, length, 1);
}
#endif
/* LFS versions of truncate are only needed on 32 bit machines */ /* LFS versions of truncate are only needed on 32 bit machines */
#if BITS_PER_LONG == 32 #if BITS_PER_LONG == 32
SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length) SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length)

View file

@ -536,6 +536,8 @@ asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
struct file_handle __user *handle, struct file_handle __user *handle,
int flags); int flags);
asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp, asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp, compat_ulong_t __user *outp,
compat_ulong_t __user *exp, compat_ulong_t __user *exp,