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);


Reply via email to