Index: kern_exec.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_exec.c,v retrieving revision 1.107.2.7 diff -u -r1.107.2.7 kern_exec.c --- kern_exec.c 2001/06/16 23:39:08 1.107.2.7 +++ kern_exec.c 2001/07/10 00:43:48 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -39,9 +38,10 @@ #include #include #include +#include #include +#include #include -#include #include #include #include @@ -59,6 +59,7 @@ #include #include +#include #include MALLOC_DEFINE(M_PARGS, "proc-args", "Process arguments"); @@ -244,6 +245,28 @@ tmp = fdcopy(p); fdfree(p); p->p_fd = tmp; + } + + /* + * For security and other reasons, signal handlers cannot + * be shared after an exec. The new proces gets a copy of the old + * handlers. In execsigs(), the new process wll have its signals + * reset. + */ + if (p->p_procsig->ps_refcnt > 1) { + struct procsig *newprocsig; + + MALLOC(newprocsig, struct procsig *, sizeof(struct procsig), + M_SUBPROC, M_WAITOK); + bcopy(p->p_procsig, newprocsig, sizeof(*newprocsig)); + p->p_procsig->ps_refcnt--; + p->p_procsig = newprocsig; + p->p_procsig->ps_refcnt = 1; + if (p->p_sigacts == &p->p_addr->u_sigacts) + panic("shared procsig but private sigacts?\n"); + + p->p_addr->u_sigacts = *p->p_sigacts; + p->p_sigacts = &p->p_addr->u_sigacts; } /* Stop profiling */