diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/uvm/uvm_mmap.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/sys/uvm/uvm_mmap.c b/sys/uvm/uvm_mmap.c index f08e9fc3b84..dd78690e878 100644 --- a/sys/uvm/uvm_mmap.c +++ b/sys/uvm/uvm_mmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_mmap.c,v 1.162 2020/10/04 21:58:53 deraadt Exp $ */ +/* $OpenBSD: uvm_mmap.c,v 1.163 2020/10/07 12:26:20 mpi Exp $ */ /* $NetBSD: uvm_mmap.c,v 1.49 2001/02/18 21:19:08 chs Exp $ */ /* @@ -288,8 +288,11 @@ sys_mmap(struct proc *p, void *v, register_t *retval) /* check for file mappings (i.e. not anonymous) and verify file. */ if ((flags & MAP_ANON) == 0) { - if ((fp = fd_getfile(fdp, fd)) == NULL) - return (EBADF); + KERNEL_LOCK(); + if ((fp = fd_getfile(fdp, fd)) == NULL) { + error = EBADF; + goto out; + } if (fp->f_type != DTYPE_VNODE) { error = ENODEV; /* only mmap vnodes! */ @@ -313,6 +316,7 @@ sys_mmap(struct proc *p, void *v, register_t *retval) flags |= MAP_ANON; FRELE(fp, p); fp = NULL; + KERNEL_UNLOCK(); goto is_anon; } @@ -362,9 +366,7 @@ sys_mmap(struct proc *p, void *v, register_t *retval) * EPERM. */ if (fp->f_flag & FWRITE) { - KERNEL_LOCK(); error = VOP_GETATTR(vp, &va, p->p_ucred, p); - KERNEL_UNLOCK(); if (error) goto out; if ((va.va_flags & (IMMUTABLE|APPEND)) == 0) @@ -390,9 +392,9 @@ sys_mmap(struct proc *p, void *v, register_t *retval) goto out; } } - KERNEL_LOCK(); error = uvm_mmapfile(&p->p_vmspace->vm_map, &addr, size, prot, maxprot, flags, vp, pos, lim_cur(RLIMIT_MEMLOCK), p); + FRELE(fp, p); KERNEL_UNLOCK(); } else { /* MAP_ANON case */ if (fd != -1) @@ -428,7 +430,10 @@ is_anon: /* label for SunOS style /dev/zero */ /* remember to add offset */ *retval = (register_t)(addr + pageoff); + return (error); + out: + KERNEL_UNLOCK(); if (fp) FRELE(fp, p); return (error); |