signal.c (e9331ee9b164d58b4dd0abc882ba7e23d2f404b3) signal.c (f454322efbf6faee695f517c6b52c4dc03cacd3e)
1/*
2 * linux/kernel/signal.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 *
6 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson
7 *
8 * 2003-06-02 Jim Houston - Concurrent Computer Corp.

--- 2607 unchanged lines hidden (view full) ---

2616
2617 sigset_from_compat(&new_set, &new32);
2618 sigdelsetmask(&new_set, sigmask(SIGKILL)|sigmask(SIGSTOP));
2619
2620 error = sigprocmask(how, &new_set, NULL);
2621 if (error)
2622 return error;
2623 }
1/*
2 * linux/kernel/signal.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 *
6 * 1997-11-02 Modified for POSIX.1b signals by Richard Henderson
7 *
8 * 2003-06-02 Jim Houston - Concurrent Computer Corp.

--- 2607 unchanged lines hidden (view full) ---

2616
2617 sigset_from_compat(&new_set, &new32);
2618 sigdelsetmask(&new_set, sigmask(SIGKILL)|sigmask(SIGSTOP));
2619
2620 error = sigprocmask(how, &new_set, NULL);
2621 if (error)
2622 return error;
2623 }
2624 if (oset) {
2625 compat_sigset_t old32;
2626 sigset_to_compat(&old32, &old_set);
2627 if (copy_to_user(oset, &old32, sizeof(compat_sigset_t)))
2628 return -EFAULT;
2629 }
2630 return 0;
2624 return oset ? put_compat_sigset(oset, &old_set, sizeof(*oset)) : 0;
2631#else
2632 return sys_rt_sigprocmask(how, (sigset_t __user *)nset,
2633 (sigset_t __user *)oset, sigsetsize);
2634#endif
2635}
2636#endif
2637
2638static int do_sigpending(void *set, unsigned long sigsetsize)

--- 25 unchanged lines hidden (view full) ---

2664 err = -EFAULT;
2665 return err;
2666}
2667
2668#ifdef CONFIG_COMPAT
2669COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset,
2670 compat_size_t, sigsetsize)
2671{
2625#else
2626 return sys_rt_sigprocmask(how, (sigset_t __user *)nset,
2627 (sigset_t __user *)oset, sigsetsize);
2628#endif
2629}
2630#endif
2631
2632static int do_sigpending(void *set, unsigned long sigsetsize)

--- 25 unchanged lines hidden (view full) ---

2658 err = -EFAULT;
2659 return err;
2660}
2661
2662#ifdef CONFIG_COMPAT
2663COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset,
2664 compat_size_t, sigsetsize)
2665{
2672#ifdef __BIG_ENDIAN
2673 sigset_t set;
2674 int err = do_sigpending(&set, sigsetsize);
2666 sigset_t set;
2667 int err = do_sigpending(&set, sigsetsize);
2675 if (!err) {
2676 compat_sigset_t set32;
2677 sigset_to_compat(&set32, &set);
2678 /* we can get here only if sigsetsize <= sizeof(set) */
2679 if (copy_to_user(uset, &set32, sigsetsize))
2680 err = -EFAULT;
2681 }
2668 if (!err)
2669 err = put_compat_sigset(uset, &set, sigsetsize);
2682 return err;
2670 return err;
2683#else
2684 return sys_rt_sigpending((sigset_t __user *)uset, sigsetsize);
2685#endif
2686}
2687#endif
2688
2689enum siginfo_layout siginfo_layout(int sig, int si_code)
2690{
2691 enum siginfo_layout layout = SIL_KILL;
2692 if ((si_code > SI_USER) && (si_code < SI_KERNEL)) {
2693 static const struct {

--- 752 unchanged lines hidden (view full) ---

3446}
3447#ifdef CONFIG_COMPAT
3448COMPAT_SYSCALL_DEFINE4(rt_sigaction, int, sig,
3449 const struct compat_sigaction __user *, act,
3450 struct compat_sigaction __user *, oact,
3451 compat_size_t, sigsetsize)
3452{
3453 struct k_sigaction new_ka, old_ka;
2671}
2672#endif
2673
2674enum siginfo_layout siginfo_layout(int sig, int si_code)
2675{
2676 enum siginfo_layout layout = SIL_KILL;
2677 if ((si_code > SI_USER) && (si_code < SI_KERNEL)) {
2678 static const struct {

--- 752 unchanged lines hidden (view full) ---

3431}
3432#ifdef CONFIG_COMPAT
3433COMPAT_SYSCALL_DEFINE4(rt_sigaction, int, sig,
3434 const struct compat_sigaction __user *, act,
3435 struct compat_sigaction __user *, oact,
3436 compat_size_t, sigsetsize)
3437{
3438 struct k_sigaction new_ka, old_ka;
3454 compat_sigset_t mask;
3455#ifdef __ARCH_HAS_SA_RESTORER
3456 compat_uptr_t restorer;
3457#endif
3458 int ret;
3459
3460 /* XXX: Don't preclude handling different sized sigset_t's. */
3461 if (sigsetsize != sizeof(compat_sigset_t))
3462 return -EINVAL;
3463
3464 if (act) {
3465 compat_uptr_t handler;
3439#ifdef __ARCH_HAS_SA_RESTORER
3440 compat_uptr_t restorer;
3441#endif
3442 int ret;
3443
3444 /* XXX: Don't preclude handling different sized sigset_t's. */
3445 if (sigsetsize != sizeof(compat_sigset_t))
3446 return -EINVAL;
3447
3448 if (act) {
3449 compat_uptr_t handler;
3450 compat_sigset_t mask;
3466 ret = get_user(handler, &act->sa_handler);
3467 new_ka.sa.sa_handler = compat_ptr(handler);
3468#ifdef __ARCH_HAS_SA_RESTORER
3469 ret |= get_user(restorer, &act->sa_restorer);
3470 new_ka.sa.sa_restorer = compat_ptr(restorer);
3471#endif
3472 ret |= copy_from_user(&mask, &act->sa_mask, sizeof(mask));
3473 ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
3474 if (ret)
3475 return -EFAULT;
3476 sigset_from_compat(&new_ka.sa.sa_mask, &mask);
3477 }
3478
3479 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
3480 if (!ret && oact) {
3451 ret = get_user(handler, &act->sa_handler);
3452 new_ka.sa.sa_handler = compat_ptr(handler);
3453#ifdef __ARCH_HAS_SA_RESTORER
3454 ret |= get_user(restorer, &act->sa_restorer);
3455 new_ka.sa.sa_restorer = compat_ptr(restorer);
3456#endif
3457 ret |= copy_from_user(&mask, &act->sa_mask, sizeof(mask));
3458 ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
3459 if (ret)
3460 return -EFAULT;
3461 sigset_from_compat(&new_ka.sa.sa_mask, &mask);
3462 }
3463
3464 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
3465 if (!ret && oact) {
3481 sigset_to_compat(&mask, &old_ka.sa.sa_mask);
3482 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler),
3483 &oact->sa_handler);
3466 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler),
3467 &oact->sa_handler);
3484 ret |= copy_to_user(&oact->sa_mask, &mask, sizeof(mask));
3468 ret |= put_compat_sigset(&oact->sa_mask, &old_ka.sa.sa_mask,
3469 sizeof(oact->sa_mask));
3485 ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
3486#ifdef __ARCH_HAS_SA_RESTORER
3487 ret |= put_user(ptr_to_compat(old_ka.sa.sa_restorer),
3488 &oact->sa_restorer);
3489#endif
3490 }
3491 return ret;
3492}

--- 260 unchanged lines hidden ---
3470 ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
3471#ifdef __ARCH_HAS_SA_RESTORER
3472 ret |= put_user(ptr_to_compat(old_ka.sa.sa_restorer),
3473 &oact->sa_restorer);
3474#endif
3475 }
3476 return ret;
3477}

--- 260 unchanged lines hidden ---