Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

make SYSCALL_DEFINE<n>-generated wrappers do asmlinkage_protect

... and switch i386 to HAVE_SYSCALL_WRAPPERS, killing open-coded
uses of asmlinkage_protect() in a bunch of syscalls.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 2cf09666 22d1a35d

+31 -89
+2 -2
arch/x86/include/asm/syscalls.h
··· 27 27 long sys_rt_sigreturn(void); 28 28 29 29 /* kernel/tls.c */ 30 - asmlinkage int sys_set_thread_area(struct user_desc __user *); 31 - asmlinkage int sys_get_thread_area(struct user_desc __user *); 30 + asmlinkage long sys_set_thread_area(struct user_desc __user *); 31 + asmlinkage long sys_get_thread_area(struct user_desc __user *); 32 32 33 33 /* X86_32 only */ 34 34 #ifdef CONFIG_X86_32
+5 -9
arch/x86/kernel/tls.c
··· 3 3 #include <linux/sched.h> 4 4 #include <linux/user.h> 5 5 #include <linux/regset.h> 6 + #include <linux/syscalls.h> 6 7 7 8 #include <asm/uaccess.h> 8 9 #include <asm/desc.h> 9 10 #include <asm/ldt.h> 10 11 #include <asm/processor.h> 11 12 #include <asm/proto.h> 12 - #include <asm/syscalls.h> 13 13 14 14 #include "tls.h" 15 15 ··· 89 89 return 0; 90 90 } 91 91 92 - asmlinkage int sys_set_thread_area(struct user_desc __user *u_info) 92 + SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info) 93 93 { 94 - int ret = do_set_thread_area(current, -1, u_info, 1); 95 - asmlinkage_protect(1, ret, u_info); 96 - return ret; 94 + return do_set_thread_area(current, -1, u_info, 1); 97 95 } 98 96 99 97 ··· 137 139 return 0; 138 140 } 139 141 140 - asmlinkage int sys_get_thread_area(struct user_desc __user *u_info) 142 + SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info) 141 143 { 142 - int ret = do_get_thread_area(current, -1, u_info); 143 - asmlinkage_protect(1, ret, u_info); 144 - return ret; 144 + return do_get_thread_area(current, -1, u_info); 145 145 } 146 146 147 147 int regset_tls_active(struct task_struct *target,
+3 -2
arch/x86/um/tls_32.c
··· 5 5 6 6 #include <linux/percpu.h> 7 7 #include <linux/sched.h> 8 + #include <linux/syscalls.h> 8 9 #include <asm/uaccess.h> 9 10 #include <os.h> 10 11 #include <skas.h> ··· 275 274 goto out; 276 275 } 277 276 278 - int sys_set_thread_area(struct user_desc __user *user_desc) 277 + SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc) 279 278 { 280 279 struct user_desc info; 281 280 int idx, ret; ··· 323 322 return set_tls_entry(child, &info, idx, 0); 324 323 } 325 324 326 - int sys_get_thread_area(struct user_desc __user *user_desc) 325 + SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc) 327 326 { 328 327 struct user_desc info; 329 328 int idx, ret;
-2
fs/aio.c
··· 1790 1790 ret = read_events(ioctx, min_nr, nr, events, timeout); 1791 1791 put_ioctx(ioctx); 1792 1792 } 1793 - 1794 - asmlinkage_protect(5, ret, ctx_id, min_nr, nr, events, timeout); 1795 1793 return ret; 1796 1794 }
+4 -20
fs/open.c
··· 197 197 198 198 SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length) 199 199 { 200 - long ret = do_sys_ftruncate(fd, length, 1); 201 - /* avoid REGPARM breakage on x86: */ 202 - asmlinkage_protect(2, ret, fd, length); 203 - return ret; 200 + return do_sys_ftruncate(fd, length, 1); 204 201 } 205 202 206 203 #ifdef CONFIG_COMPAT ··· 216 219 217 220 SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length) 218 221 { 219 - long ret = do_sys_ftruncate(fd, length, 0); 220 - /* avoid REGPARM breakage on x86: */ 221 - asmlinkage_protect(2, ret, fd, length); 222 - return ret; 222 + return do_sys_ftruncate(fd, length, 0); 223 223 } 224 224 #endif /* BITS_PER_LONG == 32 */ 225 225 ··· 955 961 956 962 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) 957 963 { 958 - long ret; 959 - 960 964 if (force_o_largefile()) 961 965 flags |= O_LARGEFILE; 962 966 963 - ret = do_sys_open(AT_FDCWD, filename, flags, mode); 964 - /* avoid REGPARM breakage on x86: */ 965 - asmlinkage_protect(3, ret, filename, flags, mode); 966 - return ret; 967 + return do_sys_open(AT_FDCWD, filename, flags, mode); 967 968 } 968 969 969 970 SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, 970 971 umode_t, mode) 971 972 { 972 - long ret; 973 - 974 973 if (force_o_largefile()) 975 974 flags |= O_LARGEFILE; 976 975 977 - ret = do_sys_open(dfd, filename, flags, mode); 978 - /* avoid REGPARM breakage on x86: */ 979 - asmlinkage_protect(4, ret, dfd, filename, flags, mode); 980 - return ret; 976 + return do_sys_open(dfd, filename, flags, mode); 981 977 } 982 978 983 979 #ifndef __alpha__
+5 -1
include/linux/syscalls.h
··· 99 99 #define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL)) 100 100 #define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a 101 101 #define __SC_CAST(t, a) (t) a 102 + #define __SC_ARGS(t, a) a 102 103 #define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long)) 103 104 104 105 #ifdef CONFIG_FTRACE_SYSCALLS ··· 201 200 202 201 #define SYSCALL_DEFINE(name) static inline long SYSC_##name 203 202 203 + #define __PROTECT(...) asmlinkage_protect(__VA_ARGS__) 204 204 #define __SYSCALL_DEFINEx(x, name, ...) \ 205 205 asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ 206 206 static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \ 207 207 asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \ 208 208 { \ 209 + long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \ 209 210 __MAP(x,__SC_TEST,__VA_ARGS__); \ 210 - return SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \ 211 + __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \ 212 + return ret; \ 211 213 } \ 212 214 SYSCALL_ALIAS(sys##name, SyS##name); \ 213 215 static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
-5
kernel/exit.c
··· 1629 1629 } 1630 1630 1631 1631 put_pid(pid); 1632 - 1633 - /* avoid REGPARM breakage on x86: */ 1634 - asmlinkage_protect(5, ret, which, upid, infop, options, ru); 1635 1632 return ret; 1636 1633 } 1637 1634 ··· 1666 1669 ret = do_wait(&wo); 1667 1670 put_pid(pid); 1668 1671 1669 - /* avoid REGPARM breakage on x86: */ 1670 - asmlinkage_protect(4, ret, upid, stat_addr, options, ru); 1671 1672 return ret; 1672 1673 } 1673 1674
+1 -4
kernel/fork.c
··· 1674 1674 int, tls_val) 1675 1675 #endif 1676 1676 { 1677 - long ret = do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr); 1678 - asmlinkage_protect(5, ret, clone_flags, newsp, 1679 - parent_tidptr, child_tidptr, tls_val); 1680 - return ret; 1677 + return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr); 1681 1678 } 1682 1679 #endif 1683 1680
+11 -44
kernel/uid16.c
··· 18 18 19 19 SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) 20 20 { 21 - long ret = sys_chown(filename, low2highuid(user), low2highgid(group)); 22 - /* avoid REGPARM breakage on x86: */ 23 - asmlinkage_protect(3, ret, filename, user, group); 24 - return ret; 21 + return sys_chown(filename, low2highuid(user), low2highgid(group)); 25 22 } 26 23 27 24 SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) 28 25 { 29 - long ret = sys_lchown(filename, low2highuid(user), low2highgid(group)); 30 - /* avoid REGPARM breakage on x86: */ 31 - asmlinkage_protect(3, ret, filename, user, group); 32 - return ret; 26 + return sys_lchown(filename, low2highuid(user), low2highgid(group)); 33 27 } 34 28 35 29 SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) 36 30 { 37 - long ret = sys_fchown(fd, low2highuid(user), low2highgid(group)); 38 - /* avoid REGPARM breakage on x86: */ 39 - asmlinkage_protect(3, ret, fd, user, group); 40 - return ret; 31 + return sys_fchown(fd, low2highuid(user), low2highgid(group)); 41 32 } 42 33 43 34 SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) 44 35 { 45 - long ret = sys_setregid(low2highgid(rgid), low2highgid(egid)); 46 - /* avoid REGPARM breakage on x86: */ 47 - asmlinkage_protect(2, ret, rgid, egid); 48 - return ret; 36 + return sys_setregid(low2highgid(rgid), low2highgid(egid)); 49 37 } 50 38 51 39 SYSCALL_DEFINE1(setgid16, old_gid_t, gid) 52 40 { 53 - long ret = sys_setgid(low2highgid(gid)); 54 - /* avoid REGPARM breakage on x86: */ 55 - asmlinkage_protect(1, ret, gid); 56 - return ret; 41 + return sys_setgid(low2highgid(gid)); 57 42 } 58 43 59 44 SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) 60 45 { 61 - long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid)); 62 - /* avoid REGPARM breakage on x86: */ 63 - asmlinkage_protect(2, ret, ruid, euid); 64 - return ret; 46 + return sys_setreuid(low2highuid(ruid), low2highuid(euid)); 65 47 } 66 48 67 49 SYSCALL_DEFINE1(setuid16, old_uid_t, uid) 68 50 { 69 - long ret = sys_setuid(low2highuid(uid)); 70 - /* avoid REGPARM breakage on x86: */ 71 - asmlinkage_protect(1, ret, uid); 72 - return ret; 51 + return sys_setuid(low2highuid(uid)); 73 52 } 74 53 75 54 SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) 76 55 { 77 - long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid), 56 + return sys_setresuid(low2highuid(ruid), low2highuid(euid), 78 57 low2highuid(suid)); 79 - /* avoid REGPARM breakage on x86: */ 80 - asmlinkage_protect(3, ret, ruid, euid, suid); 81 - return ret; 82 58 } 83 59 84 60 SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp) ··· 76 100 77 101 SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) 78 102 { 79 - long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid), 103 + return sys_setresgid(low2highgid(rgid), low2highgid(egid), 80 104 low2highgid(sgid)); 81 - /* avoid REGPARM breakage on x86: */ 82 - asmlinkage_protect(3, ret, rgid, egid, sgid); 83 - return ret; 84 105 } 85 106 86 107 ··· 100 127 101 128 SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) 102 129 { 103 - long ret = sys_setfsuid(low2highuid(uid)); 104 - /* avoid REGPARM breakage on x86: */ 105 - asmlinkage_protect(1, ret, uid); 106 - return ret; 130 + return sys_setfsuid(low2highuid(uid)); 107 131 } 108 132 109 133 SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) 110 134 { 111 - long ret = sys_setfsgid(low2highgid(gid)); 112 - /* avoid REGPARM breakage on x86: */ 113 - asmlinkage_protect(1, ret, gid); 114 - return ret; 135 + return sys_setfsgid(low2highgid(gid)); 115 136 } 116 137 117 138 static int groups16_to_user(old_gid_t __user *grouplist,