svn commit: r366939 - stable/11/sys/kern

Brooks Davis brooks at FreeBSD.org
Thu Oct 22 16:29:22 UTC 2020


Author: brooks
Date: Thu Oct 22 16:29:21 2020
New Revision: 366939
URL: https://svnweb.freebsd.org/changeset/base/366939

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/11/sys/kern/kern_physio.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/kern/kern_physio.c
==============================================================================
--- stable/11/sys/kern/kern_physio.c	Thu Oct 22 16:27:24 2020	(r366938)
+++ stable/11/sys/kern/kern_physio.c	Thu Oct 22 16:29:21 2020	(r366939)
@@ -43,7 +43,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;
@@ -136,7 +136,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;
@@ -149,13 +149,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;
 				}
@@ -170,7 +170,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;
@@ -186,7 +186,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-all mailing list