forked from Minki/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>
This commit is contained in:
parent
22d1a35da0
commit
2cf0966683
@ -27,8 +27,8 @@ asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);
|
||||
long sys_rt_sigreturn(void);
|
||||
|
||||
/* kernel/tls.c */
|
||||
asmlinkage int sys_set_thread_area(struct user_desc __user *);
|
||||
asmlinkage int sys_get_thread_area(struct user_desc __user *);
|
||||
asmlinkage long sys_set_thread_area(struct user_desc __user *);
|
||||
asmlinkage long sys_get_thread_area(struct user_desc __user *);
|
||||
|
||||
/* X86_32 only */
|
||||
#ifdef CONFIG_X86_32
|
||||
|
@ -3,13 +3,13 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/regset.h>
|
||||
#include <linux/syscalls.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/ldt.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/syscalls.h>
|
||||
|
||||
#include "tls.h"
|
||||
|
||||
@ -89,11 +89,9 @@ int do_set_thread_area(struct task_struct *p, int idx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
|
||||
SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, u_info)
|
||||
{
|
||||
int ret = do_set_thread_area(current, -1, u_info, 1);
|
||||
asmlinkage_protect(1, ret, u_info);
|
||||
return ret;
|
||||
return do_set_thread_area(current, -1, u_info, 1);
|
||||
}
|
||||
|
||||
|
||||
@ -139,11 +137,9 @@ int do_get_thread_area(struct task_struct *p, int idx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
|
||||
SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, u_info)
|
||||
{
|
||||
int ret = do_get_thread_area(current, -1, u_info);
|
||||
asmlinkage_protect(1, ret, u_info);
|
||||
return ret;
|
||||
return do_get_thread_area(current, -1, u_info);
|
||||
}
|
||||
|
||||
int regset_tls_active(struct task_struct *target,
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <os.h>
|
||||
#include <skas.h>
|
||||
@ -274,7 +275,7 @@ clear:
|
||||
goto out;
|
||||
}
|
||||
|
||||
int sys_set_thread_area(struct user_desc __user *user_desc)
|
||||
SYSCALL_DEFINE1(set_thread_area, struct user_desc __user *, user_desc)
|
||||
{
|
||||
struct user_desc info;
|
||||
int idx, ret;
|
||||
@ -322,7 +323,7 @@ int ptrace_set_thread_area(struct task_struct *child, int idx,
|
||||
return set_tls_entry(child, &info, idx, 0);
|
||||
}
|
||||
|
||||
int sys_get_thread_area(struct user_desc __user *user_desc)
|
||||
SYSCALL_DEFINE1(get_thread_area, struct user_desc __user *, user_desc)
|
||||
{
|
||||
struct user_desc info;
|
||||
int idx, ret;
|
||||
|
2
fs/aio.c
2
fs/aio.c
@ -1790,7 +1790,5 @@ SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,
|
||||
ret = read_events(ioctx, min_nr, nr, events, timeout);
|
||||
put_ioctx(ioctx);
|
||||
}
|
||||
|
||||
asmlinkage_protect(5, ret, ctx_id, min_nr, nr, events, timeout);
|
||||
return ret;
|
||||
}
|
||||
|
24
fs/open.c
24
fs/open.c
@ -197,10 +197,7 @@ out:
|
||||
|
||||
SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
|
||||
{
|
||||
long ret = do_sys_ftruncate(fd, length, 1);
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(2, ret, fd, length);
|
||||
return ret;
|
||||
return do_sys_ftruncate(fd, length, 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
@ -219,10 +216,7 @@ SYSCALL_DEFINE2(truncate64, const char __user *, path, loff_t, length)
|
||||
|
||||
SYSCALL_DEFINE2(ftruncate64, unsigned int, fd, loff_t, length)
|
||||
{
|
||||
long ret = do_sys_ftruncate(fd, length, 0);
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(2, ret, fd, length);
|
||||
return ret;
|
||||
return do_sys_ftruncate(fd, length, 0);
|
||||
}
|
||||
#endif /* BITS_PER_LONG == 32 */
|
||||
|
||||
@ -961,29 +955,19 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
|
||||
|
||||
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
|
||||
{
|
||||
long ret;
|
||||
|
||||
if (force_o_largefile())
|
||||
flags |= O_LARGEFILE;
|
||||
|
||||
ret = do_sys_open(AT_FDCWD, filename, flags, mode);
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(3, ret, filename, flags, mode);
|
||||
return ret;
|
||||
return do_sys_open(AT_FDCWD, filename, flags, mode);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
|
||||
umode_t, mode)
|
||||
{
|
||||
long ret;
|
||||
|
||||
if (force_o_largefile())
|
||||
flags |= O_LARGEFILE;
|
||||
|
||||
ret = do_sys_open(dfd, filename, flags, mode);
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(4, ret, dfd, filename, flags, mode);
|
||||
return ret;
|
||||
return do_sys_open(dfd, filename, flags, mode);
|
||||
}
|
||||
|
||||
#ifndef __alpha__
|
||||
|
@ -99,6 +99,7 @@ struct sigaltstack;
|
||||
#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL))
|
||||
#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a
|
||||
#define __SC_CAST(t, a) (t) a
|
||||
#define __SC_ARGS(t, a) a
|
||||
#define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long))
|
||||
|
||||
#ifdef CONFIG_FTRACE_SYSCALLS
|
||||
@ -200,13 +201,16 @@ extern struct trace_event_functions exit_syscall_print_funcs;
|
||||
|
||||
#define SYSCALL_DEFINE(name) static inline long SYSC_##name
|
||||
|
||||
#define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
|
||||
#define __SYSCALL_DEFINEx(x, name, ...) \
|
||||
asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
|
||||
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)); \
|
||||
asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
|
||||
{ \
|
||||
long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
|
||||
__MAP(x,__SC_TEST,__VA_ARGS__); \
|
||||
return SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__)); \
|
||||
__PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__)); \
|
||||
return ret; \
|
||||
} \
|
||||
SYSCALL_ALIAS(sys##name, SyS##name); \
|
||||
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
|
||||
|
@ -1629,9 +1629,6 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
|
||||
}
|
||||
|
||||
put_pid(pid);
|
||||
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(5, ret, which, upid, infop, options, ru);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1669,8 +1666,6 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
|
||||
ret = do_wait(&wo);
|
||||
put_pid(pid);
|
||||
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(4, ret, upid, stat_addr, options, ru);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1674,10 +1674,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
|
||||
int, tls_val)
|
||||
#endif
|
||||
{
|
||||
long ret = do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
|
||||
asmlinkage_protect(5, ret, clone_flags, newsp,
|
||||
parent_tidptr, child_tidptr, tls_val);
|
||||
return ret;
|
||||
return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -18,67 +18,43 @@
|
||||
|
||||
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
|
||||
{
|
||||
long ret = sys_chown(filename, low2highuid(user), low2highgid(group));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(3, ret, filename, user, group);
|
||||
return ret;
|
||||
return sys_chown(filename, low2highuid(user), low2highgid(group));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
|
||||
{
|
||||
long ret = sys_lchown(filename, low2highuid(user), low2highgid(group));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(3, ret, filename, user, group);
|
||||
return ret;
|
||||
return sys_lchown(filename, low2highuid(user), low2highgid(group));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
|
||||
{
|
||||
long ret = sys_fchown(fd, low2highuid(user), low2highgid(group));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(3, ret, fd, user, group);
|
||||
return ret;
|
||||
return sys_fchown(fd, low2highuid(user), low2highgid(group));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
|
||||
{
|
||||
long ret = sys_setregid(low2highgid(rgid), low2highgid(egid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(2, ret, rgid, egid);
|
||||
return ret;
|
||||
return sys_setregid(low2highgid(rgid), low2highgid(egid));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
|
||||
{
|
||||
long ret = sys_setgid(low2highgid(gid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(1, ret, gid);
|
||||
return ret;
|
||||
return sys_setgid(low2highgid(gid));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
|
||||
{
|
||||
long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(2, ret, ruid, euid);
|
||||
return ret;
|
||||
return sys_setreuid(low2highuid(ruid), low2highuid(euid));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
|
||||
{
|
||||
long ret = sys_setuid(low2highuid(uid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(1, ret, uid);
|
||||
return ret;
|
||||
return sys_setuid(low2highuid(uid));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
|
||||
{
|
||||
long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid),
|
||||
return sys_setresuid(low2highuid(ruid), low2highuid(euid),
|
||||
low2highuid(suid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(3, ret, ruid, euid, suid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euidp, old_uid_t __user *, suidp)
|
||||
@ -100,11 +76,8 @@ SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euid
|
||||
|
||||
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
|
||||
{
|
||||
long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
|
||||
return sys_setresgid(low2highgid(rgid), low2highgid(egid),
|
||||
low2highgid(sgid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(3, ret, rgid, egid, sgid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -127,18 +100,12 @@ SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egid
|
||||
|
||||
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
|
||||
{
|
||||
long ret = sys_setfsuid(low2highuid(uid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(1, ret, uid);
|
||||
return ret;
|
||||
return sys_setfsuid(low2highuid(uid));
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
|
||||
{
|
||||
long ret = sys_setfsgid(low2highgid(gid));
|
||||
/* avoid REGPARM breakage on x86: */
|
||||
asmlinkage_protect(1, ret, gid);
|
||||
return ret;
|
||||
return sys_setfsgid(low2highgid(gid));
|
||||
}
|
||||
|
||||
static int groups16_to_user(old_gid_t __user *grouplist,
|
||||
|
Loading…
Reference in New Issue
Block a user