Commit 2cf0966683430b6468f36ca20515a33ca7f2403c

Authored by Al Viro
1 parent 22d1a35da0

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>

Showing 9 changed files with 31 additions and 89 deletions Side-by-side Diff

arch/x86/include/asm/syscalls.h
... ... @@ -27,8 +27,8 @@
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
arch/x86/kernel/tls.c
... ... @@ -3,13 +3,13 @@
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  
16 16  
... ... @@ -89,11 +89,9 @@
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  
100 98  
... ... @@ -139,11 +137,9 @@
139 137 return 0;
140 138 }
141 139  
142   -asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
  140 +SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info)
143 141 {
144   - int ret = do_get_thread_area(current, -1, u_info);
145   - asmlinkage_protect(1, ret, u_info);
146   - return ret;
  142 + return do_get_thread_area(current, -1, u_info);
147 143 }
148 144  
149 145 int regset_tls_active(struct task_struct *target,
arch/x86/um/tls_32.c
... ... @@ -5,6 +5,7 @@
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>
... ... @@ -274,7 +275,7 @@
274 275 goto out;
275 276 }
276 277  
277   -int sys_set_thread_area(struct user_desc __user *user_desc)
  278 +SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc)
278 279 {
279 280 struct user_desc info;
280 281 int idx, ret;
... ... @@ -322,7 +323,7 @@
322 323 return set_tls_entry(child, &info, idx, 0);
323 324 }
324 325  
325   -int sys_get_thread_area(struct user_desc __user *user_desc)
  326 +SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)
326 327 {
327 328 struct user_desc info;
328 329 int idx, ret;
... ... @@ -1790,8 +1790,6 @@
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 }
... ... @@ -197,10 +197,7 @@
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
... ... @@ -219,10 +216,7 @@
219 216  
220 217 SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)
221 218 {
222   - long ret = do_sys_ftruncate(fd, length, 0);
223   - /* avoid REGPARM breakage on x86: */
224   - asmlinkage_protect(2, ret, fd, length);
225   - return ret;
  219 + return do_sys_ftruncate(fd, length, 0);
226 220 }
227 221 #endif /* BITS_PER_LONG == 32 */
228 222  
229 223  
230 224  
231 225  
... ... @@ -961,29 +955,19 @@
961 955  
962 956 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
963 957 {
964   - long ret;
965   -
966 958 if (force_o_largefile())
967 959 flags |= O_LARGEFILE;
968 960  
969   - ret = do_sys_open(AT_FDCWD, filename, flags, mode);
970   - /* avoid REGPARM breakage on x86: */
971   - asmlinkage_protect(3, ret, filename, flags, mode);
972   - return ret;
  961 + return do_sys_open(AT_FDCWD, filename, flags, mode);
973 962 }
974 963  
975 964 SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
976 965 umode_t, mode)
977 966 {
978   - long ret;
979   -
980 967 if (force_o_largefile())
981 968 flags |= O_LARGEFILE;
982 969  
983   - ret = do_sys_open(dfd, filename, flags, mode);
984   - /* avoid REGPARM breakage on x86: */
985   - asmlinkage_protect(4, ret, dfd, filename, flags, mode);
986   - return ret;
  970 + return do_sys_open(dfd, filename, flags, mode);
987 971 }
988 972  
989 973 #ifndef __alpha__
include/linux/syscalls.h
... ... @@ -99,6 +99,7 @@
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
105 106  
106 107  
... ... @@ -200,13 +201,16 @@
200 201  
201 202 #define SYSCALL_DEFINE(name) static inline long SYSC_##name
202 203  
  204 +#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
203 205 #define __SYSCALL_DEFINEx(x, name, ...) \
204 206 asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
205 207 static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
206 208 asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
207 209 { \
  210 + long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
208 211 __MAP(x,__SC_TEST,__VA_ARGS__); \
209   - return SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
  212 + __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \
  213 + return ret; \
210 214 } \
211 215 SYSCALL_ALIAS(sys##name, SyS##name); \
212 216 static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
... ... @@ -1629,9 +1629,6 @@
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  
... ... @@ -1669,8 +1666,6 @@
1669 1666 ret = do_wait(&wo);
1670 1667 put_pid(pid);
1671 1668  
1672   - /* avoid REGPARM breakage on x86: */
1673   - asmlinkage_protect(4, ret, upid, stat_addr, options, ru);
1674 1669 return ret;
1675 1670 }
1676 1671  
... ... @@ -1674,10 +1674,7 @@
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  
... ... @@ -18,67 +18,43 @@
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)
85 61  
... ... @@ -100,11 +76,8 @@
100 76  
101 77 SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
102 78 {
103   - long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
  79 + return sys_setresgid(low2highgid(rgid), low2highgid(egid),
104 80 low2highgid(sgid));
105   - /* avoid REGPARM breakage on x86: */
106   - asmlinkage_protect(3, ret, rgid, egid, sgid);
107   - return ret;
108 81 }
109 82  
110 83  
111 84  
... ... @@ -127,18 +100,12 @@
127 100  
128 101 SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
129 102 {
130   - long ret = sys_setfsuid(low2highuid(uid));
131   - /* avoid REGPARM breakage on x86: */
132   - asmlinkage_protect(1, ret, uid);
133   - return ret;
  103 + return sys_setfsuid(low2highuid(uid));
134 104 }
135 105  
136 106 SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
137 107 {
138   - long ret = sys_setfsgid(low2highgid(gid));
139   - /* avoid REGPARM breakage on x86: */
140   - asmlinkage_protect(1, ret, gid);
141   - return ret;
  108 + return sys_setfsgid(low2highgid(gid));
142 109 }
143 110  
144 111 static int groups16_to_user(old_gid_t __user *grouplist,