[CFR][PATCH] Call proper signal handler from libthr for non-SA_SIGINFO case
Eygene Ryabinkin
rea at freebsd.org
Wed Nov 26 22:12:38 UTC 2014
Konstantin, good day.
Fri, Nov 21, 2014 at 10:32:27PM +0200, Konstantin Belousov wrote:
> On Fri, Nov 21, 2014 at 10:55:55PM +0300, Eygene Ryabinkin wrote:
> > If there is no change in behaviour that will arise from rearranging
> > the order of calls to mach-dependent and mach-independent code,
> > I'd go a bit firther and unify some repeated code,
> > http://codelabs.ru/fbsd/patches/libthr/11-CURRENT-fix-SIGINFO-processing-with-RESETHAND-v2.diff
> >
> > Works for me too, just tested with the same Squid installation.
>
> This looks correct, but is much more delicate change.
> In particular, the signal mask copied to usermode as part of
> ucontext, for restoration at sigreturn(2), seems to be correct in
> both cases, but in the postsig() case, where sendsig_common() is put
> after sv_sendsig() call, it depends on the returnmask calculation.
Since in original (unmodified) code returnmask is calculated before
the call to kern_sigprocmask(),
{{{
if (td->td_pflags & TDP_OLDMASK) {
returnmask = td->td_oldsigmask;
td->td_pflags &= ~TDP_OLDMASK;
} else
returnmask = td->td_sigmask;
mask = ps->ps_catchmask[_SIG_IDX(sig)];
if (!SIGISMEMBER(ps->ps_signodefer, sig))
SIGADDSET(mask, sig);
kern_sigprocmask(td, SIG_BLOCK, &mask, NULL,
SIGPROCMASK_PROC_LOCKED | SIGPROCMASK_PS_LOCKED);
if (SIGISMEMBER(ps->ps_sigreset, sig))
sigdflt(ps, sig);
td->td_ru.ru_nsignals++;
if (p->p_sig == sig) {
p->p_code = 0;
p->p_sig = 0;
}
(*p->p_sysent->sv_sendsig)(action, &ksi, &returnmask);
}}}
and kern_sigprocmask() only touches td->td_sigmask, such change should
be safe, because mach-dependent handlers do not use or manipulate
td_sigmask.
This looks logical, because we want to pass current original signal mask
for the thread to sv_sendsig() to make it to be restored after signal
handler's work. So returnmask is to be calculated before mangling
and should not depend on it.
> Can you test that signal mask after signal return is correct with your
> patch?
Tested with the following code:
http://codelabs.ru/fbsd/patches/libthr/kern-sig-test-sigmask-restoration.c
All tested masks are restored properly both for modified and unmodified
kernels.
> Two other notes about your patch, which should be changed before it is
> committable. First, the name sendsig_common() is not telling anything.
> Might be, rename the function to postsig_sigprop() or like.
>
> In the same vein, comment is too ambitious for small helper. This is not
> The common code, just a helper to handle thread signal mask and several
> other details of delivery. Just specifying that this is the thing to
> call after sysent->sv_sendsig() to arrange for proper bookkeeping, is
> enough.
Changed it to sendsig_adjust that should carry more sense.
Also modified comment.
> Second, function needs asserts that process lock and sigact mutex
> (ps_mtx) are locked.
Added them too. New patch is at
http://codelabs.ru/fbsd/patches/libthr/11-CURRENT-fix-SIGINFO-processing-with-RESETHAND-v3.diff
Thanks!
--
Eygene Ryabinkin ,,,^..^,,,
[ Life's unfair - but root password helps! | codelabs.ru ]
[ 82FE 06BC D497 C0DE 49EC 4FF0 16AF 9EAE 8152 ECFB | freebsd.org ]
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 358 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-threads/attachments/20141127/a570ff6e/attachment.sig>
More information about the freebsd-threads
mailing list