Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull signal/compat fixes from Al Viro: "Fixes for several regressions introduced in the last signal.git pile, along with fixing bugs in truncate and ftruncate compat (on just about anything biarch at least one of those two had been done wrong)." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: compat: restore timerfd settime and gettime compat syscalls [regression] braino in "sparc: convert to ksignal" fix compat truncate/ftruncate switch lseek to COMPAT_SYSCALL_DEFINE lseek() and truncate() on sparc really need sign extension
This commit is contained in:
commit
14cc0b55b7
|
@ -40,7 +40,7 @@ __SYSCALL(15, sys_chmod)
|
|||
__SYSCALL(16, sys_lchown16)
|
||||
__SYSCALL(17, sys_ni_syscall) /* 17 was sys_break */
|
||||
__SYSCALL(18, sys_ni_syscall) /* 18 was sys_stat */
|
||||
__SYSCALL(19, compat_sys_lseek_wrapper)
|
||||
__SYSCALL(19, compat_sys_lseek)
|
||||
__SYSCALL(20, sys_getpid)
|
||||
__SYSCALL(21, compat_sys_mount)
|
||||
__SYSCALL(22, sys_ni_syscall) /* 22 was sys_umount */
|
||||
|
@ -113,8 +113,8 @@ __SYSCALL(88, sys_reboot)
|
|||
__SYSCALL(89, sys_ni_syscall) /* 89 was sys_readdir */
|
||||
__SYSCALL(90, sys_ni_syscall) /* 90 was sys_mmap */
|
||||
__SYSCALL(91, sys_munmap)
|
||||
__SYSCALL(92, sys_truncate)
|
||||
__SYSCALL(93, sys_ftruncate)
|
||||
__SYSCALL(92, compat_sys_truncate)
|
||||
__SYSCALL(93, compat_sys_ftruncate)
|
||||
__SYSCALL(94, sys_fchmod)
|
||||
__SYSCALL(95, sys_fchown16)
|
||||
__SYSCALL(96, sys_getpriority)
|
||||
|
|
|
@ -58,11 +58,6 @@ ENDPROC(compat_sys_fstatfs64_wrapper)
|
|||
* in registers or that take 32-bit parameters which require sign
|
||||
* extension.
|
||||
*/
|
||||
compat_sys_lseek_wrapper:
|
||||
sxtw x1, w1
|
||||
b sys_lseek
|
||||
ENDPROC(compat_sys_lseek_wrapper)
|
||||
|
||||
compat_sys_pread64_wrapper:
|
||||
orr x3, x4, x5, lsl #32
|
||||
b sys_pread64
|
||||
|
|
|
@ -284,8 +284,8 @@ sys_call_table:
|
|||
PTR compat_sys_old_readdir
|
||||
PTR sys_mips_mmap /* 4090 */
|
||||
PTR sys_munmap
|
||||
PTR sys_truncate
|
||||
PTR sys_ftruncate
|
||||
PTR compat_sys_truncate
|
||||
PTR compat_sys_ftruncate
|
||||
PTR sys_fchmod
|
||||
PTR sys_fchown /* 4095 */
|
||||
PTR sys_getpriority
|
||||
|
|
|
@ -79,16 +79,6 @@ asmlinkage long sys32_sendfile64(u32 out_fd, u32 in_fd,
|
|||
(loff_t __user *)offset, count);
|
||||
}
|
||||
|
||||
|
||||
/* lseek() needs a wrapper because 'offset' can be negative, but the top
|
||||
* half of the argument has been zeroed by syscall.S.
|
||||
*/
|
||||
|
||||
asmlinkage int sys32_lseek(unsigned int fd, int offset, unsigned int origin)
|
||||
{
|
||||
return sys_lseek(fd, offset, origin);
|
||||
}
|
||||
|
||||
asmlinkage long sys32_semctl(int semid, int semnum, int cmd, union semun arg)
|
||||
{
|
||||
union semun u;
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
ENTRY_SAME(socket)
|
||||
/* struct stat is MAYBE identical wide and narrow ?? */
|
||||
ENTRY_COMP(newstat)
|
||||
ENTRY_DIFF(lseek)
|
||||
ENTRY_COMP(lseek)
|
||||
ENTRY_SAME(getpid) /* 20 */
|
||||
/* the 'void * data' parameter may need re-packing in wide */
|
||||
ENTRY_COMP(mount)
|
||||
|
@ -165,8 +165,8 @@
|
|||
ENTRY_SAME(mmap2)
|
||||
ENTRY_SAME(mmap) /* 90 */
|
||||
ENTRY_SAME(munmap)
|
||||
ENTRY_SAME(truncate)
|
||||
ENTRY_SAME(ftruncate)
|
||||
ENTRY_COMP(truncate)
|
||||
ENTRY_COMP(ftruncate)
|
||||
ENTRY_SAME(fchmod)
|
||||
ENTRY_SAME(fchown) /* 95 */
|
||||
ENTRY_SAME(getpriority)
|
||||
|
|
|
@ -22,7 +22,7 @@ SYSCALL_SPU(chmod)
|
|||
SYSCALL_SPU(lchown)
|
||||
SYSCALL(ni_syscall)
|
||||
OLDSYS(stat)
|
||||
SYSX_SPU(sys_lseek,ppc32_lseek,sys_lseek)
|
||||
COMPAT_SYS_SPU(lseek)
|
||||
SYSCALL_SPU(getpid)
|
||||
COMPAT_SYS(mount)
|
||||
SYSX(sys_ni_syscall,sys_oldumount,sys_oldumount)
|
||||
|
|
|
@ -146,24 +146,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd,
|
|||
(off_t __user *)offset, count);
|
||||
}
|
||||
|
||||
off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin)
|
||||
{
|
||||
/* sign extend n */
|
||||
return sys_lseek(fd, (int)offset, origin);
|
||||
}
|
||||
|
||||
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 prot, unsigned long flags,
|
||||
unsigned long fd, unsigned long pgoff)
|
||||
|
|
|
@ -67,12 +67,6 @@ ENTRY(sys32_lchown16_wrapper)
|
|||
llgfr %r4,%r4 # __kernel_old_uid_emu31_t
|
||||
jg sys32_lchown16 # branch to system call
|
||||
|
||||
ENTRY(sys32_lseek_wrapper)
|
||||
llgfr %r2,%r2 # unsigned int
|
||||
lgfr %r3,%r3 # off_t
|
||||
llgfr %r4,%r4 # unsigned int
|
||||
jg sys_lseek # branch to system call
|
||||
|
||||
#sys32_getpid_wrapper # void
|
||||
|
||||
ENTRY(sys32_mount_wrapper)
|
||||
|
@ -331,16 +325,6 @@ ENTRY(sys32_munmap_wrapper)
|
|||
llgfr %r3,%r3 # size_t
|
||||
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)
|
||||
llgfr %r2,%r2 # unsigned int
|
||||
llgfr %r3,%r3 # mode_t
|
||||
|
|
|
@ -27,7 +27,7 @@ SYSCALL(sys_chmod,sys_chmod,sys32_chmod_wrapper) /* 15 */
|
|||
SYSCALL(sys_lchown16,sys_ni_syscall,sys32_lchown16_wrapper) /* old lchown16 syscall*/
|
||||
NI_SYSCALL /* old break syscall holder */
|
||||
NI_SYSCALL /* old stat syscall holder */
|
||||
SYSCALL(sys_lseek,sys_lseek,sys32_lseek_wrapper)
|
||||
SYSCALL(sys_lseek,sys_lseek,compat_sys_lseek)
|
||||
SYSCALL(sys_getpid,sys_getpid,sys_getpid) /* 20 */
|
||||
SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper)
|
||||
SYSCALL(sys_oldumount,sys_oldumount,sys32_oldumount_wrapper)
|
||||
|
@ -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_old_mmap,sys_old_mmap,old32_mmap_wrapper) /* 90 */
|
||||
SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper)
|
||||
SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper)
|
||||
SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper)
|
||||
SYSCALL(sys_truncate,sys_truncate,compat_sys_truncate)
|
||||
SYSCALL(sys_ftruncate,sys_ftruncate,compat_sys_ftruncate)
|
||||
SYSCALL(sys_fchmod,sys_fchmod,sys32_fchmod_wrapper)
|
||||
SYSCALL(sys_fchown16,sys_ni_syscall,sys32_fchown16_wrapper) /* 95 old fchown16 syscall*/
|
||||
SYSCALL(sys_getpriority,sys_getpriority,sys32_getpriority_wrapper)
|
||||
|
|
|
@ -726,7 +726,7 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs
|
|||
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
||||
* mistake.
|
||||
*/
|
||||
void do_signal32(sigset_t *oldset, struct pt_regs * regs)
|
||||
void do_signal32(struct pt_regs * regs)
|
||||
{
|
||||
struct ksignal ksig;
|
||||
unsigned long orig_i0 = 0;
|
||||
|
|
|
@ -21,7 +21,7 @@ sys_call_table32:
|
|||
/*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write
|
||||
/*5*/ .word compat_sys_open, sys_close, compat_sys_wait4, sys_creat, sys_link
|
||||
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
|
||||
/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys_lseek
|
||||
/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, compat_sys_lseek
|
||||
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
|
||||
/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
|
||||
/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
|
||||
|
@ -43,8 +43,8 @@ sys_call_table32:
|
|||
/*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
|
||||
/*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, sys_truncate
|
||||
/*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
|
||||
.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate
|
||||
/*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
|
||||
/*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
|
||||
|
|
|
@ -218,11 +218,6 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd,
|
|||
* Some system calls that need sign extended arguments. This could be
|
||||
* done by a generic wrapper.
|
||||
*/
|
||||
long sys32_lseek(unsigned int fd, int offset, unsigned int whence)
|
||||
{
|
||||
return sys_lseek(fd, offset, whence);
|
||||
}
|
||||
|
||||
long sys32_kill(int pid, int sig)
|
||||
{
|
||||
return sys_kill(pid, sig);
|
||||
|
|
|
@ -43,7 +43,6 @@ asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32);
|
|||
asmlinkage long sys32_personality(unsigned long);
|
||||
asmlinkage long sys32_sendfile(int, int, compat_off_t __user *, s32);
|
||||
|
||||
long sys32_lseek(unsigned int, int, unsigned int);
|
||||
long sys32_kill(int, int);
|
||||
long sys32_fadvise64_64(int, __u32, __u32, __u32, __u32, int);
|
||||
long sys32_vm86_warning(void);
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
16 i386 lchown sys_lchown16
|
||||
17 i386 break
|
||||
18 i386 oldstat sys_stat
|
||||
19 i386 lseek sys_lseek sys32_lseek
|
||||
19 i386 lseek sys_lseek compat_sys_lseek
|
||||
20 i386 getpid sys_getpid
|
||||
21 i386 mount sys_mount compat_sys_mount
|
||||
22 i386 umount sys_oldumount
|
||||
|
@ -98,8 +98,8 @@
|
|||
89 i386 readdir sys_old_readdir compat_sys_old_readdir
|
||||
90 i386 mmap sys_old_mmap sys32_mmap
|
||||
91 i386 munmap sys_munmap
|
||||
92 i386 truncate sys_truncate
|
||||
93 i386 ftruncate sys_ftruncate
|
||||
92 i386 truncate sys_truncate compat_sys_truncate
|
||||
93 i386 ftruncate sys_ftruncate compat_sys_ftruncate
|
||||
94 i386 fchmod sys_fchmod
|
||||
95 i386 fchown sys_fchown16
|
||||
96 i386 getpriority sys_getpriority
|
||||
|
|
15
fs/open.c
15
fs/open.c
|
@ -30,6 +30,7 @@
|
|||
#include <linux/fs_struct.h>
|
||||
#include <linux/ima.h>
|
||||
#include <linux/dnotify.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
@ -140,6 +141,13 @@ SYSCALL_DEFINE2(truncate, const char __user *, path, long, 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)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
@ -195,6 +203,13 @@ SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
|
|||
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 */
|
||||
#if BITS_PER_LONG == 32
|
||||
SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length)
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/syscalls.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/splice.h>
|
||||
#include <linux/compat.h>
|
||||
#include "read_write.h"
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -247,6 +248,13 @@ SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence)
|
|||
return retval;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence)
|
||||
{
|
||||
return sys_lseek(fd, offset, whence);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __ARCH_WANT_SYS_LLSEEK
|
||||
SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
|
||||
unsigned long, offset_low, loff_t __user *, result,
|
||||
|
@ -278,7 +286,6 @@ out_putf:
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* rw_verify_area doesn't like huge counts. We limit
|
||||
* them to something that fits in "int" so that others
|
||||
|
|
10
fs/timerfd.c
10
fs/timerfd.c
|
@ -383,10 +383,10 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
|
|||
return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0;
|
||||
}
|
||||
|
||||
#ifdef COMPAT
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
||||
const struct itimerspec __user *, utmr,
|
||||
struct itimerspec __user *, otmr)
|
||||
const struct compat_itimerspec __user *, utmr,
|
||||
struct compat_itimerspec __user *, otmr)
|
||||
{
|
||||
struct itimerspec new, old;
|
||||
int ret;
|
||||
|
@ -402,12 +402,12 @@ COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
|
|||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd,
|
||||
struct itimerspec __user *, otmr)
|
||||
struct compat_itimerspec __user *, otmr)
|
||||
{
|
||||
struct itimerspec kotmr;
|
||||
int ret = do_timerfd_gettime(ufd, &kotmr);
|
||||
if (ret)
|
||||
return ret;
|
||||
return put_compat_itimerspec(otmr, &t) ? -EFAULT: 0;
|
||||
return put_compat_itimerspec(otmr, &kotmr) ? -EFAULT: 0;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -359,6 +359,7 @@ asmlinkage ssize_t compat_sys_preadv(unsigned long fd,
|
|||
asmlinkage ssize_t compat_sys_pwritev(unsigned long fd,
|
||||
const struct compat_iovec __user *vec,
|
||||
unsigned long vlen, u32 pos_low, u32 pos_high);
|
||||
asmlinkage long comat_sys_lseek(unsigned int, compat_off_t, unsigned int);
|
||||
|
||||
asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
|
||||
const compat_uptr_t __user *envp);
|
||||
|
@ -535,6 +536,8 @@ asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
|
|||
asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
|
||||
struct file_handle __user *handle,
|
||||
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,
|
||||
compat_ulong_t __user *outp,
|
||||
compat_ulong_t __user *exp,
|
||||
|
|
Loading…
Reference in New Issue