Module Name: src Committed By: martin Date: Wed Mar 4 20:30:00 UTC 2015
Modified Files: src/sys/arch/atari/atari: trap.c src/sys/arch/cesfic/cesfic: trap.c src/sys/arch/hp300/hp300: trap.c src/sys/arch/luna68k/luna68k: trap.c src/sys/arch/mvme68k/mvme68k: trap.c src/sys/arch/news68k/news68k: trap.c src/sys/arch/next68k/next68k: trap.c src/sys/arch/sun2/sun2: trap.c src/sys/arch/sun3/sun3: trap.c src/sys/arch/x68k/x68k: trap.c Log Message: Handle EINVAL in the fault path and send SIGBUS on mmap'd access past EOF To generate a diff of this commit: cvs rdiff -u -r1.112 -r1.113 src/sys/arch/atari/atari/trap.c cvs rdiff -u -r1.56 -r1.57 src/sys/arch/cesfic/cesfic/trap.c cvs rdiff -u -r1.150 -r1.151 src/sys/arch/hp300/hp300/trap.c cvs rdiff -u -r1.68 -r1.69 src/sys/arch/luna68k/luna68k/trap.c cvs rdiff -u -r1.107 -r1.108 src/sys/arch/mvme68k/mvme68k/trap.c cvs rdiff -u -r1.68 -r1.69 src/sys/arch/news68k/news68k/trap.c cvs rdiff -u -r1.87 -r1.88 src/sys/arch/next68k/next68k/trap.c cvs rdiff -u -r1.43 -r1.44 src/sys/arch/sun2/sun2/trap.c cvs rdiff -u -r1.143 -r1.144 src/sys/arch/sun3/sun3/trap.c cvs rdiff -u -r1.105 -r1.106 src/sys/arch/x68k/x68k/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/atari/atari/trap.c diff -u src/sys/arch/atari/atari/trap.c:1.112 src/sys/arch/atari/atari/trap.c:1.113 --- src/sys/arch/atari/atari/trap.c:1.112 Sun Feb 19 21:06:05 2012 +++ src/sys/arch/atari/atari/trap.c Wed Mar 4 20:29:59 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.112 2012/02/19 21:06:05 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.113 2015/03/04 20:29:59 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.112 2012/02/19 21:06:05 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.113 2015/03/04 20:29:59 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -656,14 +656,26 @@ trap(struct frame *fp, int type, u_int c panictrap(type, code, v, fp); } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/cesfic/cesfic/trap.c diff -u src/sys/arch/cesfic/cesfic/trap.c:1.56 src/sys/arch/cesfic/cesfic/trap.c:1.57 --- src/sys/arch/cesfic/cesfic/trap.c:1.56 Sun Feb 19 21:06:06 2012 +++ src/sys/arch/cesfic/cesfic/trap.c Wed Mar 4 20:29:59 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.56 2012/02/19 21:06:06 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.57 2015/03/04 20:29:59 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.56 2012/02/19 21:06:06 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.57 2015/03/04 20:29:59 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -610,14 +610,26 @@ trap(struct frame *fp, int type, unsigne goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/hp300/hp300/trap.c diff -u src/sys/arch/hp300/hp300/trap.c:1.150 src/sys/arch/hp300/hp300/trap.c:1.151 --- src/sys/arch/hp300/hp300/trap.c:1.150 Fri Aug 16 13:39:47 2013 +++ src/sys/arch/hp300/hp300/trap.c Wed Mar 4 20:29:59 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.150 2013/08/16 13:39:47 tsutsui Exp $ */ +/* $NetBSD: trap.c,v 1.151 2015/03/04 20:29:59 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.150 2013/08/16 13:39:47 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.151 2015/03/04 20:29:59 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -632,14 +632,26 @@ trap(struct frame *fp, int type, u_int c goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/luna68k/luna68k/trap.c diff -u src/sys/arch/luna68k/luna68k/trap.c:1.68 src/sys/arch/luna68k/luna68k/trap.c:1.69 --- src/sys/arch/luna68k/luna68k/trap.c:1.68 Sun Feb 19 21:06:13 2012 +++ src/sys/arch/luna68k/luna68k/trap.c Wed Mar 4 20:29:59 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.68 2012/02/19 21:06:13 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.69 2015/03/04 20:29:59 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.68 2012/02/19 21:06:13 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.69 2015/03/04 20:29:59 martin Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -559,14 +559,26 @@ trap(struct frame *fp, int type, unsigne goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/mvme68k/mvme68k/trap.c diff -u src/sys/arch/mvme68k/mvme68k/trap.c:1.107 src/sys/arch/mvme68k/mvme68k/trap.c:1.108 --- src/sys/arch/mvme68k/mvme68k/trap.c:1.107 Mon Mar 24 19:52:27 2014 +++ src/sys/arch/mvme68k/mvme68k/trap.c Wed Mar 4 20:29:59 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.107 2014/03/24 19:52:27 christos Exp $ */ +/* $NetBSD: trap.c,v 1.108 2015/03/04 20:29:59 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.107 2014/03/24 19:52:27 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.108 2015/03/04 20:29:59 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -628,14 +628,26 @@ trap(struct frame *fp, int type, unsigne goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/news68k/news68k/trap.c diff -u src/sys/arch/news68k/news68k/trap.c:1.68 src/sys/arch/news68k/news68k/trap.c:1.69 --- src/sys/arch/news68k/news68k/trap.c:1.68 Sun Feb 19 21:06:21 2012 +++ src/sys/arch/news68k/news68k/trap.c Wed Mar 4 20:30:00 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.68 2012/02/19 21:06:21 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.69 2015/03/04 20:30:00 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.68 2012/02/19 21:06:21 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.69 2015/03/04 20:30:00 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -575,14 +575,26 @@ trap(struct frame *fp, int type, u_int c goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/next68k/next68k/trap.c diff -u src/sys/arch/next68k/next68k/trap.c:1.87 src/sys/arch/next68k/next68k/trap.c:1.88 --- src/sys/arch/next68k/next68k/trap.c:1.87 Mon Mar 24 20:01:03 2014 +++ src/sys/arch/next68k/next68k/trap.c Wed Mar 4 20:30:00 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.87 2014/03/24 20:01:03 christos Exp $ */ +/* $NetBSD: trap.c,v 1.88 2015/03/04 20:30:00 martin Exp $ */ /* * This file was taken from mvme68k/mvme68k/trap.c @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.87 2014/03/24 20:01:03 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.88 2015/03/04 20:30:00 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -620,14 +620,26 @@ trap(struct frame *fp, int type, unsigne goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } Index: src/sys/arch/sun2/sun2/trap.c diff -u src/sys/arch/sun2/sun2/trap.c:1.43 src/sys/arch/sun2/sun2/trap.c:1.44 --- src/sys/arch/sun2/sun2/trap.c:1.43 Sun Feb 19 21:06:32 2012 +++ src/sys/arch/sun2/sun2/trap.c Wed Mar 4 20:30:00 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.43 2012/02/19 21:06:32 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.44 2015/03/04 20:30:00 martin Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993 @@ -78,7 +78,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.43 2012/02/19 21:06:32 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.44 2015/03/04 20:30:00 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -582,14 +582,26 @@ trap(struct trapframe *tf, int type, u_i goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } /* T_MMUFLT */ Index: src/sys/arch/sun3/sun3/trap.c diff -u src/sys/arch/sun3/sun3/trap.c:1.143 src/sys/arch/sun3/sun3/trap.c:1.144 --- src/sys/arch/sun3/sun3/trap.c:1.143 Sat Sep 7 15:56:11 2013 +++ src/sys/arch/sun3/sun3/trap.c Wed Mar 4 20:30:00 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.143 2013/09/07 15:56:11 tsutsui Exp $ */ +/* $NetBSD: trap.c,v 1.144 2015/03/04 20:30:00 martin Exp $ */ /* * Copyright (c) 1982, 1986, 1990, 1993 @@ -78,7 +78,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.143 2013/09/07 15:56:11 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.144 2015/03/04 20:30:00 martin Exp $"); #include "opt_ddb.h" #include "opt_execfmt.h" @@ -591,14 +591,26 @@ trap(struct trapframe *tf, int type, u_i goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; } /* T_MMUFLT */ Index: src/sys/arch/x68k/x68k/trap.c diff -u src/sys/arch/x68k/x68k/trap.c:1.105 src/sys/arch/x68k/x68k/trap.c:1.106 --- src/sys/arch/x68k/x68k/trap.c:1.105 Sun Feb 19 21:06:34 2012 +++ src/sys/arch/x68k/x68k/trap.c Wed Mar 4 20:30:00 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.105 2012/02/19 21:06:34 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.106 2015/03/04 20:30:00 martin Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.105 2012/02/19 21:06:34 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.106 2015/03/04 20:30:00 martin Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -629,14 +629,26 @@ trap(struct frame *fp, int type, unsigne goto dopanic; } ksi.ksi_addr = (void *)v; - 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; - } else { + break; + case EINVAL: + ksi.ksi_signo = SIGBUS; + ksi.ksi_code = BUS_ADRERR; + break; + case EACCES: ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_ACCERR; + break; + default: + ksi.ksi_signo = SIGSEGV; + ksi.ksi_code = SEGV_MAPERR; + break; } break; }