Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull signal handling cleanups from Al Viro: "sigaltstack infrastructure + conversion for x86, alpha and um, COMPAT_SYSCALL_DEFINE infrastructure. Note that there are several conflicts between "unify SS_ONSTACK/SS_DISABLE definitions" and UAPI patches in mainline; resolution is trivial - just remove definitions of SS_ONSTACK and SS_DISABLED from arch/*/uapi/asm/signal.h; they are all identical and include/uapi/linux/signal.h contains the unified variant." Fixed up conflicts as per Al. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: alpha: switch to generic sigaltstack new helpers: __save_altstack/__compat_save_altstack, switch x86 and um to those generic compat_sys_sigaltstack() introduce generic sys_sigaltstack(), switch x86 and um to it new helper: compat_user_stack_pointer() new helper: restore_altstack() unify SS_ONSTACK/SS_DISABLE definitions new helper: current_user_stack_pointer() missing user_stack_pointer() instances Bury the conditionals from kernel_thread/kernel_execve series COMPAT_SYSCALL_DEFINE: infrastructure
This commit is contained in:
@@ -119,8 +119,4 @@ extern void install_exec_creds(struct linux_binprm *bprm);
|
||||
extern void set_binfmt(struct linux_binfmt *new);
|
||||
extern void free_bprm(struct linux_binprm *);
|
||||
|
||||
#ifdef __ARCH_WANT_KERNEL_EXECVE
|
||||
extern void ret_from_kernel_execve(struct pt_regs *normal) __noreturn;
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_BINFMTS_H */
|
||||
|
@@ -23,6 +23,61 @@
|
||||
#define COMPAT_USE_64BIT_TIME 0
|
||||
#endif
|
||||
|
||||
#ifndef __SC_DELOUSE
|
||||
#define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))
|
||||
#endif
|
||||
|
||||
#define __SC_CCAST1(t1, a1) __SC_DELOUSE(t1,a1)
|
||||
#define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__)
|
||||
#define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__)
|
||||
#define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__)
|
||||
#define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__)
|
||||
#define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__)
|
||||
#define COMPAT_SYSCALL_DEFINE1(name, ...) \
|
||||
COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
|
||||
#define COMPAT_SYSCALL_DEFINE2(name, ...) \
|
||||
COMPAT_SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
|
||||
#define COMPAT_SYSCALL_DEFINE3(name, ...) \
|
||||
COMPAT_SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
|
||||
#define COMPAT_SYSCALL_DEFINE4(name, ...) \
|
||||
COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
|
||||
#define COMPAT_SYSCALL_DEFINE5(name, ...) \
|
||||
COMPAT_SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
|
||||
#define COMPAT_SYSCALL_DEFINE6(name, ...) \
|
||||
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
|
||||
|
||||
#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
|
||||
|
||||
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
||||
asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)); \
|
||||
static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
|
||||
asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__)) \
|
||||
{ \
|
||||
return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__)); \
|
||||
} \
|
||||
SYSCALL_ALIAS(compat_sys##name, compat_SyS##name); \
|
||||
static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__))
|
||||
|
||||
#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
|
||||
|
||||
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
|
||||
asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__))
|
||||
|
||||
#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
|
||||
|
||||
#ifndef compat_user_stack_pointer
|
||||
#define compat_user_stack_pointer() current_user_stack_pointer()
|
||||
#endif
|
||||
#ifdef CONFIG_GENERIC_SIGALTSTACK
|
||||
#ifndef compat_sigaltstack /* we'll need that for MIPS */
|
||||
typedef struct compat_sigaltstack {
|
||||
compat_uptr_t ss_sp;
|
||||
int ss_flags;
|
||||
compat_size_t ss_size;
|
||||
} compat_stack_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define compat_jiffies_to_clock_t(x) \
|
||||
(((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
|
||||
|
||||
@@ -587,6 +642,13 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
|
||||
|
||||
asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
|
||||
compat_off_t __user *offset, compat_size_t count);
|
||||
#ifdef CONFIG_GENERIC_SIGALTSTACK
|
||||
asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
|
||||
compat_stack_t __user *uoss_ptr);
|
||||
|
||||
int compat_restore_altstack(const compat_stack_t __user *uss);
|
||||
int __compat_save_altstack(compat_stack_t __user *, unsigned long);
|
||||
#endif
|
||||
|
||||
asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
||||
struct compat_timespec __user *interval);
|
||||
|
@@ -344,6 +344,10 @@ static inline void user_single_step_siginfo(struct task_struct *tsk,
|
||||
#define signal_pt_regs() task_pt_regs(current)
|
||||
#endif
|
||||
|
||||
#ifndef current_user_stack_pointer
|
||||
#define current_user_stack_pointer() user_stack_pointer(current_pt_regs())
|
||||
#endif
|
||||
|
||||
extern int task_current_syscall(struct task_struct *target, long *callno,
|
||||
unsigned long args[6], unsigned int maxargs,
|
||||
unsigned long *sp, unsigned long *pc);
|
||||
|
@@ -2353,9 +2353,7 @@ extern int do_execve(const char *,
|
||||
const char __user * const __user *);
|
||||
extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *);
|
||||
struct task_struct *fork_idle(int);
|
||||
#ifdef CONFIG_GENERIC_KERNEL_THREAD
|
||||
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
|
||||
#endif
|
||||
|
||||
extern void set_task_comm(struct task_struct *tsk, char *from);
|
||||
extern char *get_task_comm(char *to, struct task_struct *tsk);
|
||||
|
@@ -385,4 +385,7 @@ int unhandled_signal(struct task_struct *tsk, int sig);
|
||||
|
||||
void signals_init(void);
|
||||
|
||||
int restore_altstack(const stack_t __user *);
|
||||
int __save_altstack(stack_t __user *, unsigned long);
|
||||
|
||||
#endif /* _LINUX_SIGNAL_H */
|
||||
|
@@ -63,6 +63,7 @@ struct getcpu_cache;
|
||||
struct old_linux_dirent;
|
||||
struct perf_event_attr;
|
||||
struct file_handle;
|
||||
struct sigaltstack;
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/aio_abi.h>
|
||||
@@ -299,6 +300,11 @@ asmlinkage long sys_personality(unsigned int personality);
|
||||
asmlinkage long sys_sigpending(old_sigset_t __user *set);
|
||||
asmlinkage long sys_sigprocmask(int how, old_sigset_t __user *set,
|
||||
old_sigset_t __user *oset);
|
||||
#ifdef CONFIG_GENERIC_SIGALTSTACK
|
||||
asmlinkage long sys_sigaltstack(const struct sigaltstack __user *uss,
|
||||
struct sigaltstack __user *uoss);
|
||||
#endif
|
||||
|
||||
asmlinkage long sys_getitimer(int which, struct itimerval __user *value);
|
||||
asmlinkage long sys_setitimer(int which,
|
||||
struct itimerval __user *value,
|
||||
@@ -827,15 +833,6 @@ asmlinkage long sys_fanotify_mark(int fanotify_fd, unsigned int flags,
|
||||
const char __user *pathname);
|
||||
asmlinkage long sys_syncfs(int fd);
|
||||
|
||||
#ifndef CONFIG_GENERIC_KERNEL_EXECVE
|
||||
int kernel_execve(const char *filename, const char *const argv[], const char *const envp[]);
|
||||
#else
|
||||
#define kernel_execve(filename, argv, envp) \
|
||||
do_execve(filename, \
|
||||
(const char __user *const __user *)argv, \
|
||||
(const char __user *const __user *)envp)
|
||||
#endif
|
||||
|
||||
asmlinkage long sys_fork(void);
|
||||
asmlinkage long sys_vfork(void);
|
||||
#ifdef CONFIG_CLONE_BACKWARDS
|
||||
|
Reference in New Issue
Block a user