From c75556a12f51d0e4ecdc37fa278d1f28704dd413 Mon Sep 17 00:00:00 2001 From: fair Date: Sun, 6 Feb 2000 07:29:56 +0000 Subject: [PATCH] Add kernel logging of processes which exit on signals which can cause a core to drop, and whether the core dropped, or, if it did not, why not (i.e. error number). Logs process ID, name, signal that hit it, and whether the core dump was successful. logging only happens if kern_logsigexit is non-zero, and it can be changed by the new sysctl(3) value KERN_LOGSIGEXIT. The name of this sysctl and its function are taken from FreeBSD, at the suggestion of Greg Woods in PR 6224. Default behavior is zero for a normal kernel, and one for a kernel compiled with DIAGNOSTIC. --- sys/kern/kern_sig.c | 29 +++++++++++++++++++++++++++-- sys/kern/kern_sysctl.c | 5 ++++- sys/sys/sysctl.h | 6 ++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index c36a877cac68..c0835b84dbd3 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.95 1999/12/30 16:00:23 eeh Exp $ */ +/* $NetBSD: kern_sig.c,v 1.96 2000/02/06 07:29:56 fair Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -1238,17 +1238,42 @@ killproc(p, why) * If dumping core, save the signal number for the debugger. Calls exit and * does not return. */ + +#if defined(DIAGNOSTIC) || defined(DEBUG) +int kern_logsigexit = 1; /* not static to make public for sysctl */ +#else +int kern_logsigexit = 0; /* not static to make public for sysctl */ +#endif + +static char *logcoredump = + "pid %d (%s), uid %d: exited on signal %d (core dumped)\n"; +static char *lognocoredump = + "pid %d (%s), uid %d: exited on signal %d (core not dumped, err = %d)\n"; + void sigexit(p, signum) register struct proc *p; int signum; { + int error; + char *errmsg; + p->p_acflag |= AXSIG; if (sigprop[signum] & SA_CORE) { p->p_sigacts->ps_sig = signum; - if (coredump(p) == 0) + if ((error = coredump(p)) == 0) { signum |= WCOREFLAG; + errmsg = logcoredump; + } else { + errmsg = lognocoredump; + } + + if (kern_logsigexit) + log(LOG_INFO, errmsg, p->p_pid, p->p_comm, + p->p_cred && p->p_ucred ? p->p_ucred->cr_uid : -1, + signum &~ WCOREFLAG, error); } + exit1(p, W_EXITCODE(0, signum)); /* NOTREACHED */ } diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index 5d43f543f74c..aea624754d87 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sysctl.c,v 1.56 2000/01/16 15:07:48 assar Exp $ */ +/* $NetBSD: kern_sysctl.c,v 1.57 2000/02/06 07:29:58 fair Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -233,6 +233,7 @@ int defcorenamelen = sizeof(DEFCORENAME); char defcorename[MAXPATHLEN] = "%n.core"; int defcorenamelen = sizeof("%n.core"); #endif +extern int kern_logsigexit; /* * kernel related system variables. @@ -422,6 +423,8 @@ kern_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) return (sysctl_rdint(oldp, oldlenp, newp, 1)); case KERN_LOGIN_NAME_MAX: return (sysctl_rdint(oldp, oldlenp, newp, LOGIN_NAME_MAX)); + case KERN_LOGSIGEXIT: + return (sysctl_int(oldp, oldlenp, newp, newlen, &kern_logsigexit)); default: return (EOPNOTSUPP); } diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index b85a7bb5205b..2d63651cdd27 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -1,4 +1,4 @@ -/* $NetBSD: sysctl.h,v 1.39 1999/11/19 10:41:41 bouyer Exp $ */ +/* $NetBSD: sysctl.h,v 1.40 2000/02/06 07:29:59 fair Exp $ */ /* * Copyright (c) 1989, 1993 @@ -157,7 +157,8 @@ struct ctlname { #define KERN_MEMORY_PROTECTION 43 /* int: POSIX memory protections */ #define KERN_LOGIN_NAME_MAX 44 /* int: max length login name + NUL */ #define KERN_DEFCORENAME 45 /* old: sort core name format */ -#define KERN_MAXID 46 /* number of valid kern ids */ +#define KERN_LOGSIGEXIT 46 /* int: log signalled processes */ +#define KERN_MAXID 47 /* number of valid kern ids */ #define CTL_KERN_NAMES { \ { 0, 0 }, \ @@ -206,6 +207,7 @@ struct ctlname { { "memory_protection", CTLTYPE_INT }, \ { "login_name_max", CTLTYPE_INT }, \ { "defcorename", CTLTYPE_STRING }, \ + { "logsigexit", CTLTYPE_INT }, \ } /*