Commit 2e4f7c7769a0b8b6b3e88b0436c6c634f146a4ef
1 parent
b013c39924
Exists in
master
and in
39 other branches
signal: sys_sigprocmask() needs retarget_shared_pending()
sys_sigprocmask() changes current->blocked by hand. Convert this code to use set_current_blocked(). Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Showing 1 changed file with 9 additions and 13 deletions Side-by-side Diff
kernel/signal.c
... | ... | @@ -2900,7 +2900,7 @@ |
2900 | 2900 | old_sigset_t __user *, oset) |
2901 | 2901 | { |
2902 | 2902 | old_sigset_t old_set, new_set; |
2903 | - int error; | |
2903 | + sigset_t new_blocked; | |
2904 | 2904 | |
2905 | 2905 | old_set = current->blocked.sig[0]; |
2906 | 2906 | |
2907 | 2907 | |
2908 | 2908 | |
2909 | 2909 | |
2910 | 2910 | |
2911 | 2911 | |
2912 | 2912 | |
... | ... | @@ -2909,27 +2909,23 @@ |
2909 | 2909 | return -EFAULT; |
2910 | 2910 | new_set &= ~(sigmask(SIGKILL) | sigmask(SIGSTOP)); |
2911 | 2911 | |
2912 | - error = 0; | |
2913 | - spin_lock_irq(¤t->sighand->siglock); | |
2912 | + new_blocked = current->blocked; | |
2913 | + | |
2914 | 2914 | switch (how) { |
2915 | - default: | |
2916 | - error = -EINVAL; | |
2917 | - break; | |
2918 | 2915 | case SIG_BLOCK: |
2919 | - sigaddsetmask(¤t->blocked, new_set); | |
2916 | + sigaddsetmask(&new_blocked, new_set); | |
2920 | 2917 | break; |
2921 | 2918 | case SIG_UNBLOCK: |
2922 | - sigdelsetmask(¤t->blocked, new_set); | |
2919 | + sigdelsetmask(&new_blocked, new_set); | |
2923 | 2920 | break; |
2924 | 2921 | case SIG_SETMASK: |
2925 | - current->blocked.sig[0] = new_set; | |
2922 | + new_blocked.sig[0] = new_set; | |
2926 | 2923 | break; |
2924 | + default: | |
2925 | + return -EINVAL; | |
2927 | 2926 | } |
2928 | 2927 | |
2929 | - recalc_sigpending(); | |
2930 | - spin_unlock_irq(¤t->sighand->siglock); | |
2931 | - if (error) | |
2932 | - return error; | |
2928 | + set_current_blocked(&new_blocked); | |
2933 | 2929 | } |
2934 | 2930 | |
2935 | 2931 | if (oset) { |