signal: simplify set_user_sigmask/restore_user_sigmask
task->saved_sigmask and ->restore_sigmask are only used in the ret-from- syscall paths. This means that set_user_sigmask() can save ->blocked in ->saved_sigmask and do set_restore_sigmask() to indicate that ->blocked was modified. This way the callers do not need 2 sigset_t's passed to set/restore and restore_user_sigmask() renamed to restore_saved_sigmask_unless() turns into the trivial helper which just calls restore_saved_sigmask(). Link: http://lkml.kernel.org/r/20190606113206.GA9464@redhat.com Signed-off-by: Oleg Nesterov <oleg@redhat.com> Cc: Deepa Dinamani <deepa.kernel@gmail.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Jens Axboe <axboe@kernel.dk> Cc: Davidlohr Bueso <dave@stgolabs.net> Cc: Eric Wong <e@80x24.org> Cc: Jason Baron <jbaron@akamai.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Eric W. Biederman <ebiederm@xmission.com> Cc: David Laight <David.Laight@aculab.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
e2d9018e81
commit
b772434be0
34
fs/select.c
34
fs/select.c
@@ -730,7 +730,6 @@ static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
|
||||
const sigset_t __user *sigmask, size_t sigsetsize,
|
||||
enum poll_time_type type)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
struct timespec64 ts, end_time, *to = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -753,12 +752,12 @@ static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = set_user_sigmask(sigmask, &ksigmask, &sigsaved, sigsetsize);
|
||||
ret = set_user_sigmask(sigmask, sigsetsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = core_sys_select(n, inp, outp, exp, to);
|
||||
restore_user_sigmask(sigmask, &sigsaved, ret == -ERESTARTNOHAND);
|
||||
restore_saved_sigmask_unless(ret == -ERESTARTNOHAND);
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, type, ret);
|
||||
|
||||
return ret;
|
||||
@@ -1086,7 +1085,6 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
|
||||
struct __kernel_timespec __user *, tsp, const sigset_t __user *, sigmask,
|
||||
size_t, sigsetsize)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
struct timespec64 ts, end_time, *to = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -1099,17 +1097,16 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = set_user_sigmask(sigmask, &ksigmask, &sigsaved, sigsetsize);
|
||||
ret = set_user_sigmask(sigmask, sigsetsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR);
|
||||
restore_saved_sigmask_unless(ret == -EINTR);
|
||||
/* We can restart this syscall, usually */
|
||||
if (ret == -EINTR)
|
||||
ret = -ERESTARTNOHAND;
|
||||
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, PT_TIMESPEC, ret);
|
||||
|
||||
return ret;
|
||||
@@ -1121,7 +1118,6 @@ SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, unsigned int, nfds,
|
||||
struct old_timespec32 __user *, tsp, const sigset_t __user *, sigmask,
|
||||
size_t, sigsetsize)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
struct timespec64 ts, end_time, *to = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -1134,17 +1130,16 @@ SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds, unsigned int, nfds,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = set_user_sigmask(sigmask, &ksigmask, &sigsaved, sigsetsize);
|
||||
ret = set_user_sigmask(sigmask, sigsetsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR);
|
||||
restore_saved_sigmask_unless(ret == -EINTR);
|
||||
/* We can restart this syscall, usually */
|
||||
if (ret == -EINTR)
|
||||
ret = -ERESTARTNOHAND;
|
||||
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, PT_OLD_TIMESPEC, ret);
|
||||
|
||||
return ret;
|
||||
@@ -1319,7 +1314,6 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
||||
void __user *tsp, compat_sigset_t __user *sigmask,
|
||||
compat_size_t sigsetsize, enum poll_time_type type)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
struct timespec64 ts, end_time, *to = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -1342,12 +1336,12 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = set_compat_user_sigmask(sigmask, &ksigmask, &sigsaved, sigsetsize);
|
||||
ret = set_compat_user_sigmask(sigmask, sigsetsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = compat_core_sys_select(n, inp, outp, exp, to);
|
||||
restore_user_sigmask(sigmask, &sigsaved, ret == -ERESTARTNOHAND);
|
||||
restore_saved_sigmask_unless(ret == -ERESTARTNOHAND);
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, type, ret);
|
||||
|
||||
return ret;
|
||||
@@ -1402,7 +1396,6 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds,
|
||||
unsigned int, nfds, struct old_timespec32 __user *, tsp,
|
||||
const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
struct timespec64 ts, end_time, *to = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -1415,17 +1408,16 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time32, struct pollfd __user *, ufds,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = set_compat_user_sigmask(sigmask, &ksigmask, &sigsaved, sigsetsize);
|
||||
ret = set_compat_user_sigmask(sigmask, sigsetsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR);
|
||||
restore_saved_sigmask_unless(ret == -EINTR);
|
||||
/* We can restart this syscall, usually */
|
||||
if (ret == -EINTR)
|
||||
ret = -ERESTARTNOHAND;
|
||||
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, PT_OLD_TIMESPEC, ret);
|
||||
|
||||
return ret;
|
||||
@@ -1437,7 +1429,6 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct pollfd __user *, ufds,
|
||||
unsigned int, nfds, struct __kernel_timespec __user *, tsp,
|
||||
const compat_sigset_t __user *, sigmask, compat_size_t, sigsetsize)
|
||||
{
|
||||
sigset_t ksigmask, sigsaved;
|
||||
struct timespec64 ts, end_time, *to = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -1450,17 +1441,16 @@ COMPAT_SYSCALL_DEFINE5(ppoll_time64, struct pollfd __user *, ufds,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = set_compat_user_sigmask(sigmask, &ksigmask, &sigsaved, sigsetsize);
|
||||
ret = set_compat_user_sigmask(sigmask, sigsetsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
restore_user_sigmask(sigmask, &sigsaved, ret == -EINTR);
|
||||
restore_saved_sigmask_unless(ret == -EINTR);
|
||||
/* We can restart this syscall, usually */
|
||||
if (ret == -EINTR)
|
||||
ret = -ERESTARTNOHAND;
|
||||
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, PT_TIMESPEC, ret);
|
||||
|
||||
return ret;
|
||||
|
Reference in New Issue
Block a user