The patch titled improve sys_personality() for compat architectures has been added to the -mm tree. Its filename is improve-sys_personality-for-compat-architectures.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://userweb.kernel.org/~akpm/stuff/added-to-mm.txt to find out what to do about this The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: improve sys_personality() for compat architectures From: Christoph Hellwig <hch@xxxxxx> On an architecture that supports 32-bit compat we need to claim to be PER_LINUX even if we're actually PER_LINUX32. Instead of duplicating the code for that in all architectures and having various bugs in the handling of personality flags do it once and right in the common code. Signed-off-by: Christoph Hellwig <hch@xxxxxx> Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx> Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> Cc: Paul Mundt <lethal@xxxxxxxxxxxx> Cc: Jeff Dike <jdike@xxxxxxxxxxx> Cc: Hirokazu Takata <takata@xxxxxxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Cc: H. Peter Anvin <hpa@xxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Arnd Bergmann <arnd@xxxxxxxx> Cc: Heiko Carstens <heiko.carstens@xxxxxxxxxx> Cc: Martin Schwidefsky <schwidefsky@xxxxxxxxxx> Cc: "Luck, Tony" <tony.luck@xxxxxxxxx> Cc: James Morris <jmorris@xxxxxxxxx> Cc: Andreas Schwab <schwab@xxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- arch/ia64/ia32/ia32_entry.S | 2 +- arch/ia64/ia32/sys_ia32.c | 13 ------------- arch/mips/kernel/linux32.c | 13 ------------- arch/mips/kernel/scall64-n32.S | 2 +- arch/mips/kernel/scall64-o32.S | 2 +- arch/parisc/kernel/sys_parisc.c | 15 --------------- arch/parisc/kernel/syscall_table.S | 2 +- arch/powerpc/include/asm/syscalls.h | 1 - arch/powerpc/include/asm/systbl.h | 2 +- arch/powerpc/kernel/syscalls.c | 15 --------------- arch/s390/kernel/compat_wrapper.S | 2 +- arch/s390/kernel/entry.h | 1 - arch/s390/kernel/sys_s390.c | 13 ------------- arch/s390/kernel/syscalls.S | 2 +- arch/sparc/kernel/sys_sparc_64.c | 14 -------------- arch/sparc/kernel/systbls.h | 1 - arch/sparc/kernel/systbls_64.S | 4 ++-- arch/x86/ia32/sys_ia32.c | 14 -------------- arch/x86/include/asm/sys_ia32.h | 1 - kernel/exec_domain.c | 11 ++++++++++- 20 files changed, 19 insertions(+), 111 deletions(-) diff -puN arch/ia64/ia32/ia32_entry.S~improve-sys_personality-for-compat-architectures arch/ia64/ia32/ia32_entry.S --- a/arch/ia64/ia32/ia32_entry.S~improve-sys_personality-for-compat-architectures +++ a/arch/ia64/ia32/ia32_entry.S @@ -314,7 +314,7 @@ ia32_syscall_table: data8 sys_fchdir data8 sys_ni_syscall /* sys_bdflush */ data8 sys_sysfs /* 135 */ - data8 sys32_personality + data8 sys_personality data8 sys_ni_syscall /* for afs_syscall */ data8 sys_setfsuid /* 16-bit version */ data8 sys_setfsgid /* 16-bit version */ diff -puN arch/ia64/ia32/sys_ia32.c~improve-sys_personality-for-compat-architectures arch/ia64/ia32/sys_ia32.c --- a/arch/ia64/ia32/sys_ia32.c~improve-sys_personality-for-compat-architectures +++ a/arch/ia64/ia32/sys_ia32.c @@ -1867,19 +1867,6 @@ sys32_sendfile (int out_fd, int in_fd, i return ret; } -asmlinkage long -sys32_personality (unsigned int personality) -{ - long ret; - - if (current->personality == PER_LINUX32 && personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) - ret = PER_LINUX; - return ret; -} - asmlinkage unsigned long sys32_brk (unsigned int brk) { diff -puN arch/mips/kernel/linux32.c~improve-sys_personality-for-compat-architectures arch/mips/kernel/linux32.c --- a/arch/mips/kernel/linux32.c~improve-sys_personality-for-compat-architectures +++ a/arch/mips/kernel/linux32.c @@ -265,19 +265,6 @@ SYSCALL_DEFINE1(32_newuname, struct new_ return ret; } -SYSCALL_DEFINE1(32_personality, unsigned long, personality) -{ - int ret; - personality &= 0xffffffff; - if (personality(current->personality) == PER_LINUX32 && - personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) - ret = PER_LINUX; - return ret; -} - SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd, compat_off_t __user *, offset, s32, count) { diff -puN arch/mips/kernel/scall64-n32.S~improve-sys_personality-for-compat-architectures arch/mips/kernel/scall64-n32.S --- a/arch/mips/kernel/scall64-n32.S~improve-sys_personality-for-compat-architectures +++ a/arch/mips/kernel/scall64-n32.S @@ -252,7 +252,7 @@ EXPORT(sysn32_call_table) PTR sys32_sigaltstack PTR compat_sys_utime /* 6130 */ PTR sys_mknod - PTR sys_32_personality + PTR sys_personality PTR compat_sys_ustat PTR compat_sys_statfs PTR compat_sys_fstatfs /* 6135 */ diff -puN arch/mips/kernel/scall64-o32.S~improve-sys_personality-for-compat-architectures arch/mips/kernel/scall64-o32.S --- a/arch/mips/kernel/scall64-o32.S~improve-sys_personality-for-compat-architectures +++ a/arch/mips/kernel/scall64-o32.S @@ -339,7 +339,7 @@ sys_call_table: PTR sys_fchdir PTR sys_bdflush PTR sys_sysfs /* 4135 */ - PTR sys_32_personality + PTR sys_personality PTR sys_ni_syscall /* for afs_syscall */ PTR sys_setfsuid PTR sys_setfsgid diff -puN arch/parisc/kernel/sys_parisc.c~improve-sys_personality-for-compat-architectures arch/parisc/kernel/sys_parisc.c --- a/arch/parisc/kernel/sys_parisc.c~improve-sys_personality-for-compat-architectures +++ a/arch/parisc/kernel/sys_parisc.c @@ -220,21 +220,6 @@ asmlinkage int sys_free_hugepages(unsign return -EINVAL; } -long parisc_personality(unsigned long personality) -{ - long err; - - if (personality(current->personality) == PER_LINUX32 - && personality == PER_LINUX) - personality = PER_LINUX32; - - err = sys_personality(personality); - if (err == PER_LINUX32) - err = PER_LINUX; - - return err; -} - long parisc_newuname(struct new_utsname __user *name) { int err = sys_newuname(name); diff -puN arch/parisc/kernel/syscall_table.S~improve-sys_personality-for-compat-architectures arch/parisc/kernel/syscall_table.S --- a/arch/parisc/kernel/syscall_table.S~improve-sys_personality-for-compat-architectures +++ a/arch/parisc/kernel/syscall_table.S @@ -216,7 +216,7 @@ ENTRY_SAME(fchdir) ENTRY_SAME(bdflush) ENTRY_SAME(sysfs) /* 135 */ - ENTRY_OURS(personality) + ENTRY_SAME(personality) ENTRY_SAME(ni_syscall) /* for afs_syscall */ ENTRY_SAME(setfsuid) ENTRY_SAME(setfsgid) diff -puN arch/powerpc/include/asm/syscalls.h~improve-sys_personality-for-compat-architectures arch/powerpc/include/asm/syscalls.h --- a/arch/powerpc/include/asm/syscalls.h~improve-sys_personality-for-compat-architectures +++ a/arch/powerpc/include/asm/syscalls.h @@ -35,7 +35,6 @@ asmlinkage long sys_pipe2(int __user *fi asmlinkage long sys_rt_sigaction(int sig, const struct sigaction __user *act, struct sigaction __user *oact, size_t sigsetsize); -asmlinkage long ppc64_personality(unsigned long personality); asmlinkage int ppc_rtas(struct rtas_args __user *uargs); asmlinkage time_t sys64_time(time_t __user * tloc); asmlinkage long ppc_newuname(struct new_utsname __user * name); diff -puN arch/powerpc/include/asm/systbl.h~improve-sys_personality-for-compat-architectures arch/powerpc/include/asm/systbl.h --- a/arch/powerpc/include/asm/systbl.h~improve-sys_personality-for-compat-architectures +++ a/arch/powerpc/include/asm/systbl.h @@ -139,7 +139,7 @@ COMPAT_SYS_SPU(getpgid) SYSCALL_SPU(fchdir) SYSCALL_SPU(bdflush) COMPAT_SYS(sysfs) -SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality) +SYSCALL_SPU(personality) SYSCALL(ni_syscall) SYSCALL_SPU(setfsuid) SYSCALL_SPU(setfsgid) diff -puN arch/powerpc/kernel/syscalls.c~improve-sys_personality-for-compat-architectures arch/powerpc/kernel/syscalls.c --- a/arch/powerpc/kernel/syscalls.c~improve-sys_personality-for-compat-architectures +++ a/arch/powerpc/kernel/syscalls.c @@ -102,21 +102,6 @@ ppc_select(int n, fd_set __user *inp, fd #endif #ifdef CONFIG_PPC64 -long ppc64_personality(unsigned long personality) -{ - long ret; - - if (personality(current->personality) == PER_LINUX32 - && personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) - ret = PER_LINUX; - return ret; -} -#endif - -#ifdef CONFIG_PPC64 #define OVERRIDE_MACHINE (personality(current->personality) == PER_LINUX32) #else #define OVERRIDE_MACHINE 0 diff -puN arch/s390/kernel/compat_wrapper.S~improve-sys_personality-for-compat-architectures arch/s390/kernel/compat_wrapper.S --- a/arch/s390/kernel/compat_wrapper.S~improve-sys_personality-for-compat-architectures +++ a/arch/s390/kernel/compat_wrapper.S @@ -615,7 +615,7 @@ sys32_sysfs_wrapper: .globl sys32_personality_wrapper sys32_personality_wrapper: llgfr %r2,%r2 # unsigned long - jg sys_s390_personality # branch to system call + jg sys_personality # branch to system call .globl sys32_setfsuid16_wrapper sys32_setfsuid16_wrapper: diff -puN arch/s390/kernel/entry.h~improve-sys_personality-for-compat-architectures arch/s390/kernel/entry.h --- a/arch/s390/kernel/entry.h~improve-sys_personality-for-compat-architectures +++ a/arch/s390/kernel/entry.h @@ -33,7 +33,6 @@ long sys_mmap2(struct s390_mmap_arg_stru long sys_s390_ipc(uint call, int first, unsigned long second, unsigned long third, void __user *ptr); long sys_s390_newuname(struct new_utsname __user *name); -long sys_s390_personality(unsigned long personality); long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low, size_t len, int advice); long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); diff -puN arch/s390/kernel/sys_s390.c~improve-sys_personality-for-compat-architectures arch/s390/kernel/sys_s390.c --- a/arch/s390/kernel/sys_s390.c~improve-sys_personality-for-compat-architectures +++ a/arch/s390/kernel/sys_s390.c @@ -141,19 +141,6 @@ SYSCALL_DEFINE1(s390_newuname, struct ne } return ret; } - -SYSCALL_DEFINE1(s390_personality, unsigned long, personality) -{ - int ret; - - if (current->personality == PER_LINUX32 && personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) - ret = PER_LINUX; - - return ret; -} #endif /* CONFIG_64BIT */ /* diff -puN arch/s390/kernel/syscalls.S~improve-sys_personality-for-compat-architectures arch/s390/kernel/syscalls.S --- a/arch/s390/kernel/syscalls.S~improve-sys_personality-for-compat-architectures +++ a/arch/s390/kernel/syscalls.S @@ -144,7 +144,7 @@ SYSCALL(sys_getpgid,sys_getpgid,sys32_ge SYSCALL(sys_fchdir,sys_fchdir,sys32_fchdir_wrapper) SYSCALL(sys_bdflush,sys_bdflush,sys32_bdflush_wrapper) SYSCALL(sys_sysfs,sys_sysfs,sys32_sysfs_wrapper) /* 135 */ -SYSCALL(sys_personality,sys_s390_personality,sys32_personality_wrapper) +SYSCALL(sys_personality,sys_personality,sys32_personality_wrapper) NI_SYSCALL /* for afs_syscall */ SYSCALL(sys_setfsuid16,sys_ni_syscall,sys32_setfsuid16_wrapper) /* old setfsuid16 syscall */ SYSCALL(sys_setfsgid16,sys_ni_syscall,sys32_setfsgid16_wrapper) /* old setfsgid16 syscall */ diff -puN arch/sparc/kernel/sys_sparc_64.c~improve-sys_personality-for-compat-architectures arch/sparc/kernel/sys_sparc_64.c --- a/arch/sparc/kernel/sys_sparc_64.c~improve-sys_personality-for-compat-architectures +++ a/arch/sparc/kernel/sys_sparc_64.c @@ -522,20 +522,6 @@ SYSCALL_DEFINE1(sparc64_newuname, struct return ret; } -SYSCALL_DEFINE1(sparc64_personality, unsigned long, personality) -{ - int ret; - - if (current->personality == PER_LINUX32 && - personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) - ret = PER_LINUX; - - return ret; -} - int sparc_mmap_check(unsigned long addr, unsigned long len) { if (test_thread_flag(TIF_32BIT)) { diff -puN arch/sparc/kernel/systbls.h~improve-sys_personality-for-compat-architectures arch/sparc/kernel/systbls.h --- a/arch/sparc/kernel/systbls.h~improve-sys_personality-for-compat-architectures +++ a/arch/sparc/kernel/systbls.h @@ -15,7 +15,6 @@ extern asmlinkage long sys_sparc_ipc(uns unsigned long third, void __user *ptr, long fifth); extern asmlinkage long sparc64_newuname(struct new_utsname __user *name); -extern asmlinkage long sparc64_personality(unsigned long personality); extern asmlinkage long sys64_munmap(unsigned long addr, size_t len); extern asmlinkage unsigned long sys64_mremap(unsigned long addr, unsigned long old_len, diff -puN arch/sparc/kernel/systbls_64.S~improve-sys_personality-for-compat-architectures arch/sparc/kernel/systbls_64.S --- a/arch/sparc/kernel/systbls_64.S~improve-sys_personality-for-compat-architectures +++ a/arch/sparc/kernel/systbls_64.S @@ -56,7 +56,7 @@ sys_call_table32: .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_sparc64_newuname -/*190*/ .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl +/*190*/ .word sys32_init_module, sys_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 @@ -131,7 +131,7 @@ sys_call_table: .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_sparc64_newuname -/*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl +/*190*/ .word sys_init_module, sys_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 diff -puN arch/x86/ia32/sys_ia32.c~improve-sys_personality-for-compat-architectures arch/x86/ia32/sys_ia32.c --- a/arch/x86/ia32/sys_ia32.c~improve-sys_personality-for-compat-architectures +++ a/arch/x86/ia32/sys_ia32.c @@ -414,20 +414,6 @@ asmlinkage long sys32_pwrite(unsigned in ((loff_t)AA(poshi) << 32) | AA(poslo)); } - -asmlinkage long sys32_personality(unsigned long personality) -{ - int ret; - - if (personality(current->personality) == PER_LINUX32 && - personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) - ret = PER_LINUX; - return ret; -} - asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, s32 count) { diff -puN arch/x86/include/asm/sys_ia32.h~improve-sys_personality-for-compat-architectures arch/x86/include/asm/sys_ia32.h --- a/arch/x86/include/asm/sys_ia32.h~improve-sys_personality-for-compat-architectures +++ a/arch/x86/include/asm/sys_ia32.h @@ -51,7 +51,6 @@ asmlinkage long sys32_rt_sigqueueinfo(in asmlinkage long sys32_pread(unsigned int, char __user *, u32, u32, u32); asmlinkage long sys32_pwrite(unsigned int, char __user *, u32, u32, u32); -asmlinkage long sys32_personality(unsigned long); asmlinkage long sys32_sendfile(int, int, compat_off_t __user *, s32); struct oldold_utsname; diff -puN kernel/exec_domain.c~improve-sys_personality-for-compat-architectures kernel/exec_domain.c --- a/kernel/exec_domain.c~improve-sys_personality-for-compat-architectures +++ a/kernel/exec_domain.c @@ -188,17 +188,26 @@ static int __init proc_execdomains_init( module_init(proc_execdomains_init); #endif +/* + * Get/set the personality. + * + * Note that we simply return PER_LINUX even if we actually have a 32-bit + * task (PER_LINUX32) as this is expected by 32-bit userland. + */ SYSCALL_DEFINE1(personality, u_long, personality) { u_long old = current->personality; if (personality != 0xffffffff) { + if (personality(old) == PER_LINUX32 && + personality == PER_LINUX) + personality = PER_LINUX32; set_personality(personality); if (current->personality != personality) return -EINVAL; } - return (long)old; + return (long)(old == PER_LINUX32 ? PER_LINUX : old); } _ Patches currently in -mm which might be from hch@xxxxxx are linux-next.patch vfs-fix-vfs_rename_dir-for-fs_rename_does_d_move-filesystems.patch xtensa-convert-to-asm-generic-hardirqh.patch add-generic-sys_old_select.patch add-generic-sys_old_mmap.patch add-generic-sys_ipc-wrapper.patch improve-sys_personality-for-compat-architectures.patch improve-sys_newuname-for-compat-architectures.patch add-generic-sys_olduname.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html