Module Name: src Committed By: martin Date: Mon Mar 2 13:53:19 UTC 2015
Modified Files: src/sys/arch/sparc/sparc: trap.c Log Message: Handle EINVAL in the fault path, send SIGSEGV on mmap access past EOF. To generate a diff of this commit: cvs rdiff -u -r1.191 -r1.192 src/sys/arch/sparc/sparc/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/sparc/sparc/trap.c diff -u src/sys/arch/sparc/sparc/trap.c:1.191 src/sys/arch/sparc/sparc/trap.c:1.192 --- src/sys/arch/sparc/sparc/trap.c:1.191 Fri Nov 1 06:22:46 2013 +++ src/sys/arch/sparc/sparc/trap.c Mon Mar 2 13:53:19 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.191 2013/11/01 06:22:46 mrg Exp $ */ +/* $NetBSD: trap.c,v 1.192 2015/03/02 13:53:19 martin Exp $ */ /* * Copyright (c) 1996 @@ -49,7 +49,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.191 2013/11/01 06:22:46 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.192 2015/03/02 13:53:19 martin Exp $"); #include "opt_ddb.h" #include "opt_compat_svr4.h" @@ -949,17 +949,24 @@ kfault: return; } KSI_INIT_TRAP(&ksi); - if (rv == ENOMEM) { + switch (rv) { + case ENOMEM: printf("UVM: pid %d (%s), uid %d killed: out of swap\n", p->p_pid, p->p_comm, l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1); ksi.ksi_signo = SIGKILL; - ksi.ksi_code = SI_NOINFO; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + case EACCES: ksi.ksi_signo = SIGSEGV; - ksi.ksi_code = (rv == EACCES - ? SEGV_ACCERR : SEGV_MAPERR); + ksi.ksi_code = SEGV_ACCERR; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } ksi.ksi_trap = type; ksi.ksi_addr = (void *)v; @@ -1236,17 +1243,24 @@ kfault: return; } KSI_INIT_TRAP(&ksi); - if (rv == ENOMEM) { + switch (rv) { + case ENOMEM: printf("UVM: pid %d (%s), uid %d killed: out of swap\n", p->p_pid, p->p_comm, l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1); ksi.ksi_signo = SIGKILL; - ksi.ksi_code = SI_NOINFO; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + case EACCES: ksi.ksi_signo = SIGSEGV; - ksi.ksi_code = (rv == EACCES) - ? SEGV_ACCERR : SEGV_MAPERR; + ksi.ksi_code = SEGV_ACCERR; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } ksi.ksi_trap = type; ksi.ksi_addr = (void *)sfva;