mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
signal: Add restore_user_sigmask()
Refactor the logic to restore the sigmask before the syscall returns into an api. This is useful for versions of syscalls that pass in the sigmask and expect the current->sigmask to be changed during the execution and restored after the execution of the syscall. With the advent of new y2038 syscalls in the subsequent patches, we add two more new versions of the syscalls (for pselect, ppoll and io_pgetevents) in addition to the existing native and compat versions. Adding such an api reduces the logic that would need to be replicated otherwise. Signed-off-by: Deepa Dinamani <[email protected]> Signed-off-by: Arnd Bergmann <[email protected]>
This commit is contained in:
parent
ded653ccbe
commit
854a6ed568
5 changed files with 51 additions and 103 deletions
60
fs/select.c
60
fs/select.c
|
|
@ -724,19 +724,7 @@ static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
|
|||
ret = core_sys_select(n, inp, outp, exp, to);
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, 0, ret);
|
||||
|
||||
if (ret == -ERESTARTNOHAND) {
|
||||
/*
|
||||
* Don't restore the signal mask yet. Let do_signal() deliver
|
||||
* the signal on the way back to userspace, before the signal
|
||||
* mask is restored.
|
||||
*/
|
||||
if (sigmask) {
|
||||
memcpy(¤t->saved_sigmask, &sigsaved,
|
||||
sizeof(sigsaved));
|
||||
set_restore_sigmask();
|
||||
}
|
||||
} else if (sigmask)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
restore_user_sigmask(sigmask, &sigsaved);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1060,21 +1048,11 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
|
|||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
restore_user_sigmask(sigmask, &sigsaved);
|
||||
|
||||
/* We can restart this syscall, usually */
|
||||
if (ret == -EINTR) {
|
||||
/*
|
||||
* Don't restore the signal mask yet. Let do_signal() deliver
|
||||
* the signal on the way back to userspace, before the signal
|
||||
* mask is restored.
|
||||
*/
|
||||
if (sigmask) {
|
||||
memcpy(¤t->saved_sigmask, &sigsaved,
|
||||
sizeof(sigsaved));
|
||||
set_restore_sigmask();
|
||||
}
|
||||
if (ret == -EINTR)
|
||||
ret = -ERESTARTNOHAND;
|
||||
} else if (sigmask)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
|
||||
ret = poll_select_copy_remaining(&end_time, tsp, 0, ret);
|
||||
|
||||
|
|
@ -1316,19 +1294,7 @@ static long do_compat_pselect(int n, compat_ulong_t __user *inp,
|
|||
ret = compat_core_sys_select(n, inp, outp, exp, to);
|
||||
ret = compat_poll_select_copy_remaining(&end_time, tsp, 0, ret);
|
||||
|
||||
if (ret == -ERESTARTNOHAND) {
|
||||
/*
|
||||
* Don't restore the signal mask yet. Let do_signal() deliver
|
||||
* the signal on the way back to userspace, before the signal
|
||||
* mask is restored.
|
||||
*/
|
||||
if (sigmask) {
|
||||
memcpy(¤t->saved_sigmask, &sigsaved,
|
||||
sizeof(sigsaved));
|
||||
set_restore_sigmask();
|
||||
}
|
||||
} else if (sigmask)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
restore_user_sigmask(sigmask, &sigsaved);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1375,21 +1341,11 @@ COMPAT_SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds,
|
|||
|
||||
ret = do_sys_poll(ufds, nfds, to);
|
||||
|
||||
restore_user_sigmask(sigmask, &sigsaved);
|
||||
|
||||
/* We can restart this syscall, usually */
|
||||
if (ret == -EINTR) {
|
||||
/*
|
||||
* Don't restore the signal mask yet. Let do_signal() deliver
|
||||
* the signal on the way back to userspace, before the signal
|
||||
* mask is restored.
|
||||
*/
|
||||
if (sigmask) {
|
||||
memcpy(¤t->saved_sigmask, &sigsaved,
|
||||
sizeof(sigsaved));
|
||||
set_restore_sigmask();
|
||||
}
|
||||
if (ret == -EINTR)
|
||||
ret = -ERESTARTNOHAND;
|
||||
} else if (sigmask)
|
||||
sigprocmask(SIG_SETMASK, &sigsaved, NULL);
|
||||
|
||||
ret = compat_poll_select_copy_remaining(&end_time, tsp, 0, ret);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue