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