Commit 2e4f7c7769a0b8b6b3e88b0436c6c634f146a4ef

Authored by Oleg Nesterov
1 parent b013c39924

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

... ... @@ -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(&current->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(&current->blocked, new_set);
  2916 + sigaddsetmask(&new_blocked, new_set);
2920 2917 break;
2921 2918 case SIG_UNBLOCK:
2922   - sigdelsetmask(&current->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(&current->sighand->siglock);
2931   - if (error)
2932   - return error;
  2928 + set_current_blocked(&new_blocked);
2933 2929 }
2934 2930  
2935 2931 if (oset) {