summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/vm/vm_mmap.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 7baf8f335b38..ada1df653e79 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -38,7 +38,7 @@
* from: Utah $Hdr: vm_mmap.c 1.6 91/10/21$
*
* @(#)vm_mmap.c 8.4 (Berkeley) 1/12/94
- * $Id: vm_mmap.c,v 1.74 1998/03/07 21:37:01 dyson Exp $
+ * $Id: vm_mmap.c,v 1.75 1998/03/12 19:36:18 guido Exp $
*/
/*
@@ -295,12 +295,24 @@ mmap(p, uap)
* we're at securelevel < 1, to allow the XIG X server
* to continue to work.
*/
- if (((flags & MAP_SHARED) != 0 ||
- (vp->v_type == VCHR && disablexworkaround)) &&
- (fp->f_flag & FWRITE) == 0 && (prot & PROT_WRITE) != 0)
- return (EACCES);
- else
+
+ if ((flags & MAP_SHARED) != 0 ||
+ (vp->v_type == VCHR && disablexworkaround)) {
+ if ((fp->f_flag & FWRITE) != 0) {
+ if ((error =
+ VOP_GETATTR(vp, &va,
+ p->p_ucred, p)))
+ return (error);
+ if ((va.va_flags &
+ (IMMUTABLE|APPEND)) == 0)
+ maxprot |= VM_PROT_WRITE;
+ else if (prot & PROT_WRITE)
+ return (EPERM);
+ } else if ((prot & PROT_WRITE) != 0)
+ return (EACCES);
+ } else
maxprot |= VM_PROT_WRITE;
+
handle = (void *)vp;
}
}