Just adding a little more clarification, there is an additional change between [a] and [b]. As per [a] we would just restore the signal instead of changing the saved_sigmask and the signal could get delivered right then. [b] changes this to happen at syscall exit:
Rewording above, as there seems to be a few misrepresentations:
Just adding a little more clarification, there is an additional change between [a] and [b]. As per [a] we would just restore the signal mask instead of changing the saved_sigmask and the even the blocked signals could get delivered right then. [b] changes the restoration to happen at syscall exit:
void restore_user_sigmask(const void __user *usigmask, sigset_t *sigsaved) {
<snip> /* * When signals are pending, do not restore them here. * Restoring sigmask here can lead to delivering signals
that the above * syscalls are intended to block because of the sigmask passed in. */ if (signal_pending(current)) { current->saved_sigmask = *sigsaved; set_restore_sigmask(); return; }
-Deepa