svn commit: r366938 - stable/12/sys/kern
Brooks Davis
brooks at FreeBSD.org
Thu Oct 22 16:27:25 UTC 2020
Author: brooks
Date: Thu Oct 22 16:27:24 2020
New Revision: 366938
URL: https://svnweb.freebsd.org/changeset/base/366938
Log:
MFC r366731:
physio: Don't store user addresses in bio_data
Only assign the address from the iovec to bio_data if it is a kernel
address. This was the single place where bio_data stored (however
briefly) a userspace pointer.
Reviewed by: imp, markj
Obtained from: CheriBSD
Sponsored by: DARPA
Differential Revision: https://reviews.freebsd.org/D26783
Modified:
stable/12/sys/kern/kern_physio.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/kern/kern_physio.c
==============================================================================
--- stable/12/sys/kern/kern_physio.c Thu Oct 22 15:23:41 2020 (r366937)
+++ stable/12/sys/kern/kern_physio.c Thu Oct 22 16:27:24 2020 (r366938)
@@ -45,7 +45,7 @@ physio(struct cdev *dev, struct uio *uio, int ioflag)
struct buf *pbuf;
struct bio *bp;
struct vm_page **pages;
- caddr_t sa;
+ char *base, *sa;
u_int iolen, poff;
int error, i, npages, maxpages;
vm_prot_t prot;
@@ -140,7 +140,7 @@ physio(struct cdev *dev, struct uio *uio, int ioflag)
curthread->td_ru.ru_oublock++;
}
bp->bio_offset = uio->uio_offset;
- bp->bio_data = uio->uio_iov[i].iov_base;
+ base = uio->uio_iov[i].iov_base;
bp->bio_length = uio->uio_iov[i].iov_len;
if (bp->bio_length > dev->si_iosize_max)
bp->bio_length = dev->si_iosize_max;
@@ -153,13 +153,13 @@ physio(struct cdev *dev, struct uio *uio, int ioflag)
* larger than MAXPHYS - PAGE_SIZE must be
* page aligned or it will be fragmented.
*/
- poff = (vm_offset_t)bp->bio_data & PAGE_MASK;
+ poff = (vm_offset_t)base & PAGE_MASK;
if (pbuf && bp->bio_length + poff > pbuf->b_kvasize) {
if (dev->si_flags & SI_NOSPLIT) {
uprintf("%s: request ptr %p is not "
"on a page boundary; cannot split "
"request\n", devtoname(dev),
- bp->bio_data);
+ base);
error = EFBIG;
goto doerror;
}
@@ -174,7 +174,7 @@ physio(struct cdev *dev, struct uio *uio, int ioflag)
if (pages) {
if ((npages = vm_fault_quick_hold_pages(
&curproc->p_vmspace->vm_map,
- (vm_offset_t)bp->bio_data, bp->bio_length,
+ (vm_offset_t)base, bp->bio_length,
prot, pages, maxpages)) < 0) {
error = EFAULT;
goto doerror;
@@ -190,7 +190,8 @@ physio(struct cdev *dev, struct uio *uio, int ioflag)
bp->bio_data = unmapped_buf;
bp->bio_flags |= BIO_UNMAPPED;
}
- }
+ } else
+ bp->bio_data = base;
csw->d_strategy(bp);
if (uio->uio_rw == UIO_READ)
More information about the svn-src-stable-12
mailing list