On 2020-09-09 09:35, Martin Pieuchot wrote:
Simple helper function to centralize the manipulation of `ps_sigignore' and `p_sigmask' in kern/kern_sig.c and later on add the corresponding asserts, ok?
Yes please! OK pirofti@
Index: kern/kern_sig.c =================================================================== RCS file: /cvs/src/sys/kern/kern_sig.c,v retrieving revision 1.260 diff -u -p -r1.260 kern_sig.c --- kern/kern_sig.c 26 Aug 2020 03:16:53 -0000 1.260 +++ kern/kern_sig.c 8 Sep 2020 05:46:25 -0000 @@ -1486,6 +1486,22 @@ sigexit(struct proc *p, int signum) /* NOTREACHED */ }+/*+ * Return 1 if `sig', a given signal, is ignored or masked for `p', a given + * thread, and 0 otherwise. + */ +int +sigismasked(struct proc *p, int sig) +{ + struct process *pr = p->p_p; + + if ((pr->ps_sigacts->ps_sigignore & sigmask(sig)) || + (p->p_sigmask & sigmask(sig))) + return 1; + + return 0; +} + int nosuidcoredump = 1;struct coredump_iostate {Index: kern/tty_pty.c =================================================================== RCS file: /cvs/src/sys/kern/tty_pty.c,v retrieving revision 1.103 diff -u -p -r1.103 tty_pty.c --- kern/tty_pty.c 20 Jul 2020 14:34:16 -0000 1.103 +++ kern/tty_pty.c 8 Sep 2020 05:28:46 -0000 @@ -289,8 +289,7 @@ ptsread(dev_t dev, struct uio *uio, int again: if (pti->pt_flags & PF_REMOTE) { while (isbackground(pr, tp)) { - if ((pr->ps_sigacts->ps_sigignore & sigmask(SIGTTIN)) || - (p->p_sigmask & sigmask(SIGTTIN)) || + if (sigismasked(p, SIGTTIN) || pr->ps_pgrp->pg_jobc == 0 || pr->ps_flags & PS_PPWAIT) return (EIO); Index: kern/tty.c =================================================================== RCS file: /cvs/src/sys/kern/tty.c,v retrieving revision 1.163 diff -u -p -r1.163 tty.c --- kern/tty.c 22 Jul 2020 17:39:50 -0000 1.163 +++ kern/tty.c 8 Sep 2020 05:28:46 -0000 @@ -744,8 +744,7 @@ ttioctl(struct tty *tp, u_long cmd, cadd case TIOCSWINSZ: while (isbackground(pr, tp) && (pr->ps_flags & PS_PPWAIT) == 0 && - (pr->ps_sigacts->ps_sigignore & sigmask(SIGTTOU)) == 0 && - (p->p_sigmask & sigmask(SIGTTOU)) == 0) { + !sigismasked(p, SIGTTOU)) { if (pr->ps_pgrp->pg_jobc == 0) return (EIO); pgsignal(pr->ps_pgrp, SIGTTOU, 1); @@ -1498,8 +1497,7 @@ loop: lflag = tp->t_lflag; * Hang process if it's in the background. */ if (isbackground(pr, tp)) { - if ((pr->ps_sigacts->ps_sigignore & sigmask(SIGTTIN)) || - (p->p_sigmask & sigmask(SIGTTIN)) || + if (sigismasked(p, SIGTTIN) || pr->ps_flags & PS_PPWAIT || pr->ps_pgrp->pg_jobc == 0) { error = EIO; goto out; @@ -1749,8 +1747,7 @@ loop: pr = p->p_p; if (isbackground(pr, tp) && ISSET(tp->t_lflag, TOSTOP) && (pr->ps_flags & PS_PPWAIT) == 0 && - (pr->ps_sigacts->ps_sigignore & sigmask(SIGTTOU)) == 0 && - (p->p_sigmask & sigmask(SIGTTOU)) == 0) { + !sigismasked(p, SIGTTOU)) { if (pr->ps_pgrp->pg_jobc == 0) { error = EIO; goto out; Index: sys/signalvar.h =================================================================== RCS file: /cvs/src/sys/sys/signalvar.h,v retrieving revision 1.41 diff -u -p -r1.41 signalvar.h --- sys/signalvar.h 10 May 2020 00:56:06 -0000 1.41 +++ sys/signalvar.h 8 Sep 2020 05:29:10 -0000 @@ -126,6 +126,7 @@ void siginit(struct process *); void trapsignal(struct proc *p, int sig, u_long code, int type, union sigval val); void sigexit(struct proc *, int); +int sigismasked(struct proc *, int); int sigonstack(size_t); void setsigvec(struct proc *, int, struct sigaction *); int killpg1(struct proc *, int, int, int);
