RE: [PATCH v2] signal: Adjust error codes according to restore_user_sigmask()
From: David Laight
Date: Thu May 23 2019 - 12:21:49 EST
From: Oleg Nesterov
> On 05/23, David Laight wrote:
> >
> > I'm confused...
>
> Me too. To clarify, the current code is obviously buggy, pselect/whatever
> shouldn't return 0 (or anything else) if it was interrupted and we are going
> to deliver the signal.
If it was interrupted the return value has to be EINTR.
Whether any signal handlers are called is a separate matter.
> But it seems that Deepa has other concerns which I do not understand at all.
>
> In any case, the signal_pending() check _inside_ restore_user_sigmask() can't
> be right, with or without this patch. If nothing else, a signal can come right
> after the check.
>
> > So epoll() can return 'success' or 'timeout' (etc) and the handler for SIG_URG
> > should still be called.
>
> Not sure I understand... OK, suppose that you do
>
> block-all-signals;
> ret = pselect(..., sigmask(SIG_URG));
>
> if it returns success/timeout then the handler for SIG_URG should not be called?
Ugg...
Posix probably allows the signal handler be called at the point the event
happens rather than being deferred until the system call completes.
Queueing up the signal handler to be run at a later time (syscall exit)
certainly makes sense.
Definitely safest to call the signal handler even if success/timeout
is returned.
pselect() exists to stop the entry race, not the exit one.
> or I am totally confused...
The pselect(2) man page says that the signal handler for a signal that is
enabled for the duration should run.
Clearly it is also valid to call the signal handlers for any signals that
are allowed on entry/exit (they could happen just after the return).
Also remember that pselect() can also be used to disable signals.
So ISTM that signal handlers allowed by either signal mask
should be called during syscall exit.
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)