diff options
author | 2001-05-07 22:16:35 +0000 | |
---|---|---|
committer | 2001-05-07 22:16:35 +0000 | |
commit | 546a732cdfeb9b8805bad15e202040a672b96981 (patch) | |
tree | 57f6e1ab0914b71f066cf8429f754d0c282b9c1d /sys/kern/kern_physio.c | |
parent | temp work-around. Okay deraadt@ (diff) | |
download | wireguard-openbsd-546a732cdfeb9b8805bad15e202040a672b96981.tar.xz wireguard-openbsd-546a732cdfeb9b8805bad15e202040a672b96981.zip |
Check for failure now that uvm_vslock can return one. Before this, there was
a risk that we could crash when doing physio/sysctl when the system was
completly out of RAM and swap.
Diffstat (limited to 'sys/kern/kern_physio.c')
-rw-r--r-- | sys/kern/kern_physio.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c index 6aa0b547718..58c5b7a4eb9 100644 --- a/sys/kern/kern_physio.c +++ b/sys/kern/kern_physio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_physio.c,v 1.9 2000/11/09 16:46:52 art Exp $ */ +/* $OpenBSD: kern_physio.c,v 1.10 2001/05/07 22:16:35 art Exp $ */ /* $NetBSD: kern_physio.c,v 1.28 1997/05/19 10:43:28 pk Exp $ */ /*- @@ -101,6 +101,7 @@ physio(strategy, bp, dev, flags, minphys, uio) if (uio->uio_segflg == UIO_USERSPACE) for (i = 0; i < uio->uio_iovcnt; i++) #if defined(UVM) /* XXXCDC: map not locked, rethink */ + /* XXX - obsolete now that vslock can error? */ if (!uvm_useracc(uio->uio_iov[i].iov_base, uio->uio_iov[i].iov_len, (flags == B_READ) ? B_WRITE : B_READ)) @@ -184,8 +185,13 @@ physio(strategy, bp, dev, flags, minphys, uio) */ PHOLD(p); #if defined(UVM) - uvm_vslock(p, bp->b_data, todo, (flags & B_READ) ? - VM_PROT_READ | VM_PROT_WRITE : VM_PROT_READ); + if (uvm_vslock(p, bp->b_data, todo, (flags & B_READ) ? + VM_PROT_READ | VM_PROT_WRITE : VM_PROT_READ) != + KERN_SUCCESS) { + bp->b_flags |= B_ERROR; + bp->b_error = EFAULT; + goto after_unlock; + } #else vslock(bp->b_data, todo); #endif @@ -221,6 +227,7 @@ physio(strategy, bp, dev, flags, minphys, uio) vunmapbuf(bp, todo); #if defined(UVM) uvm_vsunlock(p, bp->b_data, todo); +after_unlock: #else vsunlock(bp->b_data, todo); #endif |