Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH v2] signal: Adjust error codes according to restore_user_sigmask() | Date | Tue, 28 May 2019 09:12:51 +0000 |
| |
From: Deepa Dinamani > Sent: 24 May 2019 18:02 ... > Look at the code before 854a6ed56839a: > > /* > * If we changed the signal mask, we need to restore the original one. > * In case we've got a signal while waiting, we do not restore the > * signal mask yet, and we allow do_signal() to deliver the signal on > * the way back to userspace, before the signal mask is restored. > */ > if (sigmask) { > ####### This err has not been changed since ep_poll() > ####### So if there is a signal before this point, but > err = 0, then we goto else. > if (err == -EINTR) { > memcpy(¤t->saved_sigmask, &sigsaved, > sizeof(sigsaved)); > set_restore_sigmask(); > } else > ############ This is a problem if there is signal > pending that is sigmask should block. > ########### This is the whole reason we have > current->saved_sigmask? > set_current_blocked(&sigsaved); > }
What happens if all that crap is just deleted (I presume from the bottom of ep_wait()) ?
I'm guessing that on the way back to userspace signal handlers for signals enabled in the process's current mask (the one specified to epoll_pwait) get called. Then the signal mask is loaded from current->saved_sigmask and and enabled signal handlers are called again. No special code there that depends on the syscall result, errno of the syscall number.
That seems exactly correct!
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| |