Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull signal handling cleanups from Al Viro: "This is the first pile; another one will come a bit later and will contain SYSCALL_DEFINE-related patches. - a bunch of signal-related syscalls (both native and compat) unified. - a bunch of compat syscalls switched to COMPAT_SYSCALL_DEFINE (fixing several potential problems with missing argument validation, while we are at it) - a lot of now-pointless wrappers killed - a couple of architectures (cris and hexagon) forgot to save altstack settings into sigframe, even though they used the (uninitialized) values in sigreturn; fixed. - microblaze fixes for delivery of multiple signals arriving at once - saner set of helpers for signal delivery introduced, several architectures switched to using those." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal: (143 commits) x86: convert to ksignal sparc: convert to ksignal arm: switch to struct ksignal * passing alpha: pass k_sigaction and siginfo_t using ksignal pointer burying unused conditionals make do_sigaltstack() static arm64: switch to generic old sigaction() (compat-only) arm64: switch to generic compat rt_sigaction() arm64: switch compat to generic old sigsuspend arm64: switch to generic compat rt_sigqueueinfo() arm64: switch to generic compat rt_sigpending() arm64: switch to generic compat rt_sigprocmask() arm64: switch to generic sigaltstack sparc: switch to generic old sigsuspend sparc: COMPAT_SYSCALL_DEFINE does all sign-extension as well as SYSCALL_DEFINE sparc: kill sign-extending wrappers for native syscalls kill sparc32_open() sparc: switch to use of generic old sigaction sparc: switch sys_compat_rt_sigaction() to COMPAT_SYSCALL_DEFINE mips: switch to generic sys_fork() and sys_clone() ...
This commit is contained in:
@ -290,8 +290,8 @@ static inline long put_compat_itimerval(struct compat_itimerval __user *o,
|
||||
__put_user(i->it_value.tv_usec, &o->it_value.tv_usec)));
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_getitimer(int which,
|
||||
struct compat_itimerval __user *it)
|
||||
COMPAT_SYSCALL_DEFINE2(getitimer, int, which,
|
||||
struct compat_itimerval __user *, it)
|
||||
{
|
||||
struct itimerval kit;
|
||||
int error;
|
||||
@ -302,9 +302,9 @@ asmlinkage long compat_sys_getitimer(int which,
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_setitimer(int which,
|
||||
struct compat_itimerval __user *in,
|
||||
struct compat_itimerval __user *out)
|
||||
COMPAT_SYSCALL_DEFINE3(setitimer, int, which,
|
||||
struct compat_itimerval __user *, in,
|
||||
struct compat_itimerval __user *, out)
|
||||
{
|
||||
struct itimerval kin, kout;
|
||||
int error;
|
||||
@ -381,9 +381,9 @@ static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set)
|
||||
memcpy(blocked->sig, &set, sizeof(set));
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_sigprocmask(int how,
|
||||
compat_old_sigset_t __user *nset,
|
||||
compat_old_sigset_t __user *oset)
|
||||
COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how,
|
||||
compat_old_sigset_t __user *, nset,
|
||||
compat_old_sigset_t __user *, oset)
|
||||
{
|
||||
old_sigset_t old_set, new_set;
|
||||
sigset_t new_blocked;
|
||||
@ -971,7 +971,7 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
|
||||
}
|
||||
|
||||
void
|
||||
sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
|
||||
sigset_from_compat(sigset_t *set, const compat_sigset_t *compat)
|
||||
{
|
||||
switch (_NSIG_WORDS) {
|
||||
case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 );
|
||||
@ -982,10 +982,20 @@ sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sigset_from_compat);
|
||||
|
||||
asmlinkage long
|
||||
compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
|
||||
struct compat_siginfo __user *uinfo,
|
||||
struct compat_timespec __user *uts, compat_size_t sigsetsize)
|
||||
void
|
||||
sigset_to_compat(compat_sigset_t *compat, const sigset_t *set)
|
||||
{
|
||||
switch (_NSIG_WORDS) {
|
||||
case 4: compat->sig[7] = (set->sig[3] >> 32); compat->sig[6] = set->sig[3];
|
||||
case 3: compat->sig[5] = (set->sig[2] >> 32); compat->sig[4] = set->sig[2];
|
||||
case 2: compat->sig[3] = (set->sig[1] >> 32); compat->sig[2] = set->sig[1];
|
||||
case 1: compat->sig[1] = (set->sig[0] >> 32); compat->sig[0] = set->sig[0];
|
||||
}
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese,
|
||||
struct compat_siginfo __user *, uinfo,
|
||||
struct compat_timespec __user *, uts, compat_size_t, sigsetsize)
|
||||
{
|
||||
compat_sigset_t s32;
|
||||
sigset_t s;
|
||||
@ -1013,18 +1023,6 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
asmlinkage long
|
||||
compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,
|
||||
struct compat_siginfo __user *uinfo)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
if (copy_siginfo_from_user32(&info, uinfo))
|
||||
return -EFAULT;
|
||||
return do_rt_tgsigqueueinfo(tgid, pid, sig, &info);
|
||||
}
|
||||
|
||||
#ifdef __ARCH_WANT_COMPAT_SYS_TIME
|
||||
@ -1067,23 +1065,6 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr)
|
||||
|
||||
#endif /* __ARCH_WANT_COMPAT_SYS_TIME */
|
||||
|
||||
#ifdef __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND
|
||||
asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat_size_t sigsetsize)
|
||||
{
|
||||
sigset_t newset;
|
||||
compat_sigset_t newset32;
|
||||
|
||||
/* XXX: Don't preclude handling different sized sigset_t's. */
|
||||
if (sigsetsize != sizeof(sigset_t))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t)))
|
||||
return -EFAULT;
|
||||
sigset_from_compat(&newset, &newset32);
|
||||
return sigsuspend(&newset);
|
||||
}
|
||||
#endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */
|
||||
|
||||
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp)
|
||||
{
|
||||
struct timex txc;
|
||||
@ -1222,9 +1203,9 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
|
||||
asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
||||
struct compat_timespec __user *interval)
|
||||
COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval,
|
||||
compat_pid_t, pid,
|
||||
struct compat_timespec __user *, interval)
|
||||
{
|
||||
struct timespec t;
|
||||
int ret;
|
||||
@ -1237,7 +1218,6 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
|
||||
return -EFAULT;
|
||||
return ret;
|
||||
}
|
||||
#endif /* __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL */
|
||||
|
||||
/*
|
||||
* Allocate user-space memory for the duration of a single system call,
|
||||
|
Reference in New Issue
Block a user