1/* 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 22 unchanged lines hidden (view full) --- 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)kern_sig.c 8.7 (Berkeley) 4/18/94 |
39 * $FreeBSD: head/sys/kern/kern_sig.c 50717 1999-09-01 00:29:56Z julian $ |
40 */ 41 42#include "opt_compat.h" 43#include "opt_ktrace.h" 44 45#define SIGPROP /* include signal properties table */ 46#include <sys/param.h> 47#include <sys/kernel.h> --- 18 unchanged lines hidden (view full) --- 66#include <machine/cpu.h> 67#ifdef SMP 68#include <machine/smp.h> 69#endif 70 71static int killpg1 __P((struct proc *cp, int signum, int pgid, int all)); 72static void setsigvec __P((struct proc *p, int signum, struct sigaction *sa)); 73static void stop __P((struct proc *)); |
74static char *expand_name __P((const char *, uid_t, int)); 75static int coredump __P((struct proc *)); |
76 77static int kern_logsigexit = 1; 78SYSCTL_INT(_kern, KERN_LOGSIGEXIT, logsigexit, CTLFLAG_RW, 79 &kern_logsigexit, 0, 80 "Log processes quitting on abnormal signals to syslog(3)"); 81 82/* 83 * Can process p, with pcred pc, send the signal signum to process q? --- 1168 unchanged lines hidden (view full) --- 1252 if (sigprop[signum] & SA_CORE) { 1253 p->p_sig = signum; 1254 /* 1255 * Log signals which would cause core dumps 1256 * (Log as LOG_INFO to appease those who don't want 1257 * these messages.) 1258 * XXX : Todo, as well as euid, write out ruid too 1259 */ |
1260 if (coredump(p) == 0) |
1261 signum |= WCOREFLAG; 1262 if (kern_logsigexit) 1263 log(LOG_INFO, 1264 "pid %d (%s), uid %d: exited on signal %d%s\n", 1265 p->p_pid, p->p_comm, 1266 p->p_cred && p->p_ucred ? p->p_ucred->cr_uid : -1, 1267 signum &~ WCOREFLAG, 1268 signum & WCOREFLAG ? " (core dumped)" : ""); --- 13 unchanged lines hidden (view full) --- 1282 * %N name of process ("name") 1283 * %P process id (pid) 1284 * %U user id (uid) 1285 * For example, "%N.core" is the default; they can be disabled completely 1286 * by using "/dev/null", or all core files can be stored in "/cores/%U/%N-%P". 1287 * This is controlled by the sysctl variable kern.corefile (see above). 1288 */ 1289 |
1290static char * |
1291expand_name(name, uid, pid) 1292const char *name; uid_t uid; pid_t pid; { 1293 char *temp; 1294 char buf[11]; /* Buffer for pid/uid -- max 4B */ 1295 int i, n; 1296 char *format = corefilename; 1297 size_t namelen; 1298 --- 50 unchanged lines hidden (view full) --- 1349 temp[n++] = format[i]; 1350 } 1351 } 1352 temp[n] = '\0'; 1353 return temp; 1354} 1355 1356/* |
1357 * Dump a process' core. The main routine does some 1358 * policy checking, and creates the name of the coredump; 1359 * then it passes on a vnode and a size limit to the process-specific 1360 * coredump routine if there is one; if there _is not_ one, it returns 1361 * ENOSYS; otherwise it returns the error from the process-specific routine. 1362 */ 1363 1364static int 1365coredump(p) 1366 register struct proc *p; 1367{ 1368 register struct vnode *vp; 1369 register struct ucred *cred = p->p_cred->pc_ucred; 1370 struct nameidata nd; 1371 struct vattr vattr; 1372 int error, error1; 1373 char *name; /* name of corefile */ 1374 off_t limit; 1375 1376 STOPEVENT(p, S_CORE, 0); 1377 1378 if ((sugid_coredump == 0) && p->p_flag & P_SUGID) 1379 return (EFAULT); 1380 1381 /* 1382 * Note that this layout means that limit checking is done 1383 * AFTER the corefile name is created. This could happen 1384 * other ways as well, so I'm not too worried about it, but 1385 * it is potentially confusing. 1386 */ 1387 name = expand_name(p->p_comm, p->p_ucred->cr_uid, p->p_pid); 1388 NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, name, p); 1389 error = vn_open(&nd, O_CREAT | FWRITE | O_NOFOLLOW, S_IRUSR | S_IWUSR); 1390 free(name, M_TEMP); 1391 if (error) 1392 return (error); 1393 vp = nd.ni_vp; 1394 1395 /* Don't dump to non-regular files or files with links. */ 1396 if (vp->v_type != VREG || 1397 VOP_GETATTR(vp, &vattr, cred, p) || vattr.va_nlink != 1) { 1398 error = EFAULT; 1399 goto out; 1400 } 1401 VATTR_NULL(&vattr); 1402 vattr.va_size = 0; 1403 VOP_LEASE(vp, p, cred, LEASE_WRITE); 1404 VOP_SETATTR(vp, &vattr, cred, p); 1405 p->p_acflag |= ACORE; 1406 1407 limit = p->p_rlimit[RLIMIT_CORE].rlim_cur; 1408 1409 error = p->p_sysent->sv_coredump ? 1410 p->p_sysent->sv_coredump(p, vp, limit) : 1411 ENOSYS; 1412 1413out: 1414 VOP_UNLOCK(vp, 0, p); 1415 error1 = vn_close(vp, FWRITE, cred, p); 1416 if (error == 0) 1417 error = error1; 1418 return (error); 1419} 1420 1421/* |
1422 * Nonexistent system call-- signal process (may want to handle it). 1423 * Flag error in case process won't see signal immediately (blocked or ignored). 1424 */ 1425#ifndef _SYS_SYSPROTO_H_ 1426struct nosys_args { 1427 int dummy; 1428}; 1429#endif --- 37 unchanged lines hidden --- |