On Tue, Sep 15, 2020 at 12:52:40PM +0200, Martin Pieuchot wrote: > Diff below introduces an helper for sending an uncatchable SIGABRT and > annotate that `p_siglist' and `p_sigmask' are updated using atomic > operations. > > As a result setsigvec() becomes local to kern/kern_sig.c. > > Note that other places in the kernel use sigexit(p, SIGABRT) for the > same purpose and aren't converted by this change. > > Ik?
OK claudio@ but I would split the proc.h into its own commit since it is unrelated to the sigabort() introduction. > Index: kern/kern_pledge.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_pledge.c,v > retrieving revision 1.263 > diff -u -p -r1.263 kern_pledge.c > --- kern/kern_pledge.c 17 Jul 2020 16:28:19 -0000 1.263 > +++ kern/kern_pledge.c 15 Sep 2020 08:30:19 -0000 > @@ -529,7 +529,6 @@ pledge_fail(struct proc *p, int error, u > { > const char *codes = ""; > int i; > - struct sigaction sa; > > /* Print first matching pledge */ > for (i = 0; code && pledgenames[i].bits != 0; i++) > @@ -550,11 +549,7 @@ pledge_fail(struct proc *p, int error, u > p->p_p->ps_acflag |= APLEDGE; > > /* Send uncatchable SIGABRT for coredump */ > - memset(&sa, 0, sizeof sa); > - sa.sa_handler = SIG_DFL; > - setsigvec(p, SIGABRT, &sa); > - atomic_clearbits_int(&p->p_sigmask, sigmask(SIGABRT)); > - psignal(p, SIGABRT); > + sigabort(p); > > p->p_p->ps_pledge = 0; /* Disable all PLEDGE_ flags */ > KERNEL_UNLOCK(); > Index: kern/kern_proc.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_proc.c,v > retrieving revision 1.86 > diff -u -p -r1.86 kern_proc.c > --- kern/kern_proc.c 30 Jan 2020 08:51:27 -0000 1.86 > +++ kern/kern_proc.c 15 Sep 2020 08:52:57 -0000 > @@ -494,7 +494,6 @@ void > db_kill_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) > { > struct process *pr; > - struct sigaction sa; > struct proc *p; > > pr = prfind(addr); > @@ -506,11 +505,7 @@ db_kill_cmd(db_expr_t addr, int have_add > p = TAILQ_FIRST(&pr->ps_threads); > > /* Send uncatchable SIGABRT for coredump */ > - memset(&sa, 0, sizeof sa); > - sa.sa_handler = SIG_DFL; > - setsigvec(p, SIGABRT, &sa); > - atomic_clearbits_int(&p->p_sigmask, sigmask(SIGABRT)); > - psignal(p, SIGABRT); > + sigabort(p); > } > > void > Index: kern/kern_sig.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_sig.c,v > retrieving revision 1.262 > diff -u -p -r1.262 kern_sig.c > --- kern/kern_sig.c 13 Sep 2020 13:33:37 -0000 1.262 > +++ kern/kern_sig.c 15 Sep 2020 08:33:04 -0000 > @@ -122,6 +122,8 @@ const int sigprop[NSIG + 1] = { > #define stopsigmask (sigmask(SIGSTOP) | sigmask(SIGTSTP) | \ > sigmask(SIGTTIN) | sigmask(SIGTTOU)) > > +void setsigvec(struct proc *, int, struct sigaction *); > + > void proc_stop(struct proc *p, int); > void proc_stop_sweep(void *); > void *proc_stop_si; > @@ -1483,6 +1493,21 @@ sigexit(struct proc *p, int signum) > } > exit1(p, 0, signum, EXIT_NORMAL); > /* NOTREACHED */ > +} > + > +/* > + * Send uncatchable SIGABRT for coredump. > + */ > +void > +sigabort(struct proc *p) > +{ > + struct sigaction sa; > + > + memset(&sa, 0, sizeof sa); > + sa.sa_handler = SIG_DFL; > + setsigvec(p, SIGABRT, &sa); > + atomic_clearbits_int(&p->p_sigmask, sigmask(SIGABRT)); > + psignal(p, SIGABRT); > } > > /* > Index: sys/signalvar.h > =================================================================== > RCS file: /cvs/src/sys/sys/signalvar.h,v > retrieving revision 1.43 > diff -u -p -r1.43 signalvar.h > --- sys/signalvar.h 13 Sep 2020 13:33:37 -0000 1.43 > +++ sys/signalvar.h 15 Sep 2020 08:34:15 -0000 > @@ -126,9 +126,9 @@ void siginit(struct sigacts *); > void trapsignal(struct proc *p, int sig, u_long code, int type, > union sigval val); > void sigexit(struct proc *, int); > +void sigabort(struct proc *); > int sigismasked(struct proc *, int); > int sigonstack(size_t); > -void setsigvec(struct proc *, int, struct sigaction *); > int killpg1(struct proc *, int, int, int); > > void signal_init(void); > Index: sys/proc.h > =================================================================== > RCS file: /cvs/src/sys/sys/proc.h,v > retrieving revision 1.299 > diff -u -p -r1.299 proc.h > --- sys/proc.h 26 Aug 2020 03:19:09 -0000 1.299 > +++ sys/proc.h 15 Sep 2020 10:15:36 -0000 > @@ -383,14 +383,14 @@ struct proc { > struct kcov_dev *p_kd; /* kcov device handle */ > struct lock_list_entry *p_sleeplocks; /* WITNESS lock tracking */ > > - int p_siglist; /* Signals arrived but not delivered. */ > + int p_siglist; /* [a] Signals arrived & not delivered*/ > > /* End area that is zeroed on creation. */ > #define p_endzero p_startcopy > > /* The following fields are all copied upon creation in fork. */ > #define p_startcopy p_sigmask > - sigset_t p_sigmask; /* Current signal mask. */ > + sigset_t p_sigmask; /* [a] Current signal mask */ > > u_char p_slppri; /* [S] Sleeping priority */ > u_char p_usrpri; /* [S] Priority based on p_estcpu & ps_nice */ > -- :wq Claudio