kernel/compat.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/kernel/compat.c b/kernel/compat.c index 39c164e02d05..d2c67aa49ae6 100644 --- a/kernel/compat.c +++ b/kernel/compat.c @@ -372,6 +372,15 @@ asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set) #ifdef __ARCH_WANT_SYS_SIGPROCMASK +/* + * sys_sigprocmask SIG_SETMASK sets the first (compat) word of the + * blocked set of signals to the supplied signal set + */ +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) @@ -396,9 +405,7 @@ asmlinkage long compat_sys_sigprocmask(int how, sigdelsetmask(&new_blocked, new_set); break; case SIG_SETMASK: - new_blocked.sig[0] &= - ~((old_sigset_t)(compat_old_sigset_t)-1); - new_blocked.sig[0] |= new_set; + compat_sig_setmask(&new_blocked, new_set); break; default: return -EINVAL;