This is revision 3 of this patch. Apply by doing cd /sys patch < vm_mmap.patch Index: vm/vm_mmap.c =================================================================== RCS file: /cvs/src/sys/vm/vm_mmap.c,v retrieving revision 1.10 retrieving revision 1.13 diff -u -r1.10 -r1.13 --- vm_mmap.c 1997/11/14 20:56:08 1.10 +++ vm_mmap.c 1998/02/25 22:13:46 1.13 @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_mmap.c,v 1.8 1997/07/25 06:03:08 mickey Exp $ */ +/* $OpenBSD: vm_mmap.c,v 1.13 1998/02/25 22:13:46 deraadt Exp $ */ /* $NetBSD: vm_mmap.c,v 1.47 1996/03/16 23:15:23 christos Exp $ */ /* @@ -213,8 +213,7 @@ if (fp->f_type != DTYPE_VNODE) return (EINVAL); vp = (struct vnode *)fp->f_data; - if (vp->v_type != VREG && vp->v_type != VCHR) - return (EINVAL); + /* * XXX hack to handle use of /dev/zero to map anon * memory (ala SunOS). @@ -223,6 +222,14 @@ flags |= MAP_ANON; goto is_anon; } + + /* + * Only files and cdevs are mappable, and cdevs does not + * provide private mappings of any kind. + */ + if (vp->v_type != VREG && + (vp->v_type != VCHR || (flags & (MAP_PRIVATE|MAP_COPY)))) + return (EINVAL); /* * Ensure that file and memory protections are * compatible. Note that we only worry about @@ -236,13 +243,18 @@ if (fp->f_flag & FREAD) maxprot |= VM_PROT_READ; else if (prot & PROT_READ) + return (EACCES); + + /* + * If we are sharing potential changes (either via MAP_SHARED + * or via the implicit sharing of character device mappings), + * and we are trying to get write permission although we + * opened it without asking for it, bail out. + */ + if (((flags & MAP_SHARED) != 0 || vp->v_type == VCHR) && + (fp->f_flag & FWRITE) == 0 && (prot & PROT_WRITE) != 0) return (EACCES); - if (flags & MAP_SHARED) { - if (fp->f_flag & FWRITE) - maxprot |= VM_PROT_WRITE; - else if (prot & PROT_WRITE) - return (EACCES); - } else + else maxprot |= VM_PROT_WRITE; handle = (caddr_t)vp; } else {