diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 00cd1ce998be..4a0934e03d5c 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -3352,7 +3352,29 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize) | |||
3352 | return -EFAULT; | 3352 | return -EFAULT; |
3353 | return sigsuspend(&newset); | 3353 | return sigsuspend(&newset); |
3354 | } | 3354 | } |
3355 | #endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */ | 3355 | |
3356 | #ifdef CONFIG_COMPAT | ||
3357 | COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_size_t, sigsetsize) | ||
3358 | { | ||
3359 | #ifdef __BIG_ENDIAN | ||
3360 | sigset_t newset; | ||
3361 | compat_sigset_t newset32; | ||
3362 | |||
3363 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
3364 | if (sigsetsize != sizeof(sigset_t)) | ||
3365 | return -EINVAL; | ||
3366 | |||
3367 | if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t))) | ||
3368 | return -EFAULT; | ||
3369 | sigset_from_compat(&newset, &newset32); | ||
3370 | return sigsuspend(&newset); | ||
3371 | #else | ||
3372 | /* on little-endian bitmaps don't care about granularity */ | ||
3373 | return sys_rt_sigsuspend((sigset_t __user *)unewset, sigsetsize); | ||
3374 | #endif | ||
3375 | } | ||
3376 | #endif | ||
3377 | #endif | ||
3356 | 3378 | ||
3357 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) | 3379 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) |
3358 | { | 3380 | { |