]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 2 Mar 2013 16:34:06 +0000 (08:34 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 2 Mar 2013 16:34:06 +0000 (08:34 -0800)
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

18 files changed:
arch/arm64/include/asm/unistd32.h
arch/arm64/kernel/sys32.S
arch/mips/kernel/scall64-o32.S
arch/parisc/kernel/sys_parisc32.c
arch/parisc/kernel/syscall_table.S
arch/powerpc/include/asm/systbl.h
arch/powerpc/kernel/sys_ppc32.c
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/syscalls.S
arch/sparc/kernel/signal32.c
arch/sparc/kernel/systbls_64.S
arch/x86/ia32/sys_ia32.c
arch/x86/include/asm/sys_ia32.h
arch/x86/syscalls/syscall_32.tbl
fs/open.c
fs/read_write.c
fs/timerfd.c
include/linux/compat.h

index e60e386178d134d63caae39f0c272357de86c9b4..12f22492df4ced64e6268449a80598a2ae5676f2 100644 (file)
@@ -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)
index 6abb05721614ded2064ed3853ce10cb80a151637..9416d045a687e8fa60118a04508c371426177474 100644 (file)
@@ -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
index 402d7469e1a07c70d318b1fb6fd119594757ce6f..af8887f779f1d96577200ca3ad15dd06d4381b57 100644 (file)
@@ -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
index eca69bb8ef5f48dd503dc986a9157444c86abc1e..051c8b90231f14a7bcd7305cb3592c729f326ed5 100644 (file)
@@ -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;
index fc9cab1cc2df10453b584697cce9b5ee2b242a2c..884b91b028f01c72ef637efacf7e44c7ede28f60 100644 (file)
@@ -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)
        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)
index d906f33441c66ccbe6b79171351f091e3747e13b..535b6d8a41ccae912590c0ec14d2fb355f0f4800 100644 (file)
@@ -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)
index dbc44ba5b078b23bbcc84dbf0fdadf01f76c8b40..d0bafc0cdf069d91c58eb112113497a5ab256f76 100644 (file)
@@ -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)
index c14faf39ae36daafdd1bee5db4f476cc334b78bf..3c98c4dc5aca5be0eae8aa2c98a829d589132913 100644 (file)
@@ -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
index aaac708aa1102ee242bc20d98ac6e80a243766c7..630b935d128465fc9c2eacc76364c6e1398562f6 100644 (file)
@@ -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)
index cd5dc4d411d1fb90d4b51251f42fb5ea716c0508..b524f91dd0e51ad4a09119759c403843b9a7e3f9 100644 (file)
@@ -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;
index 260ddcd412bf45b8f37c33be3ef3720c17aa03a2..088134834dab4fd0da1293c8a3b20cb0c7a9813d 100644 (file)
@@ -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
index 592f5a9a9c0ee9d1cc3fbdfff8e210fa46862360..ad7a20cbc69932cdc97e2c334fffd418000f2ffd 100644 (file)
@@ -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);
index 0218d917f50906958e5b0b27d40f6fafb892979c..8459efc39686681e20c5cca85e86445b11b75b7d 100644 (file)
@@ -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);
index f2fe78ff22cca3a36c1ae483a95cdc69a272eed5..e6d55f0064dfd75c9c46f1d44a0b1a1ab1d1a8ca 100644 (file)
@@ -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
index 62f907e3bc36aab08513270e6e9d636da96b9664..e3441f58d2e10c4ce2fb8ba1872be57189db6b02 100644 (file)
--- a/fs/open.c
+++ b/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)
index 3ae6dbe828bf9d1e3573e6e99730b681564c195d..a698eff457fb6e510c0543c9b762cc8c8d702f23 100644 (file)
@@ -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
index 0e606b12a59df966b5509e87016d6782034ee473..32b644f0369020a1c11e1fc7378bae581e4185c7 100644 (file)
@@ -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
index de095b0462a757f8ae21d431135d96b82a3ae564..76a87fb57ac258c4f004cee14737d8570da048f0 100644 (file)
@@ -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,