mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 00:54:09 +08:00
fix compat truncate/ftruncate
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
561c673197
commit
3f6d078d4a
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
15
fs/open.c
15
fs/open.c
@ -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)
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user