Module Name: src Committed By: martin Date: Mon Mar 2 11:07:16 UTC 2015
Modified Files: src/sys/arch/alpha/alpha: trap.c Log Message: Handle EINVAL in fault path, so mmap() access past EOF gets SIGBUS. To generate a diff of this commit: cvs rdiff -u -r1.131 -r1.132 src/sys/arch/alpha/alpha/trap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/alpha/alpha/trap.c diff -u src/sys/arch/alpha/alpha/trap.c:1.131 src/sys/arch/alpha/alpha/trap.c:1.132 --- src/sys/arch/alpha/alpha/trap.c:1.131 Fri May 16 06:11:21 2014 +++ src/sys/arch/alpha/alpha/trap.c Mon Mar 2 11:07:16 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.131 2014/05/16 06:11:21 martin Exp $ */ +/* $NetBSD: trap.c,v 1.132 2015/03/02 11:07:16 martin Exp $ */ /*- * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. @@ -93,7 +93,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.131 2014/05/16 06:11:21 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.132 2015/03/02 11:07:16 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -496,19 +496,28 @@ do_fault: KSI_INIT_TRAP(&ksi); ksi.ksi_addr = (void *)a0; ksi.ksi_trap = a1; /* MMCSR VALUE */ - if (rv == ENOMEM) { + switch (rv) { + case ENOMEM: printf("UVM: pid %d (%s), uid %d killed: " "out of swap\n", l->l_proc->p_pid, l->l_proc->p_comm, l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1); ksi.ksi_signo = SIGKILL; - } else + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; - if (rv == EACCES) ksi.ksi_code = SEGV_ACCERR; - else + break; + default: + ksi.ksi_signo = SIGSEGV; ksi.ksi_code = SEGV_MAPERR; + break; + } break; }