summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@openbsd.org>2003-06-02 18:14:16 +0000
committerjason <jason@openbsd.org>2003-06-02 18:14:16 +0000
commitb463521093be71f6be2c5de0bbcef2827caae9dd (patch)
tree0f82816a4279c9675bd4a9391dd52fd3752160ea
parentdo not play w/ interrupts too much and keep 'em enabled at all times, fixes random lockups; tested by brad@ on all models (diff)
downloadwireguard-openbsd-b463521093be71f6be2c5de0bbcef2827caae9dd.tar.xz
wireguard-openbsd-b463521093be71f6be2c5de0bbcef2827caae9dd.zip
add length checks on bus_dmamap_load_uio() on the total length vs. what the
map is expecting. Also, sparc64 was missing the equivalent check in _load_mbuf() and the "make sure no valid mappings are returned" goop.
-rw-r--r--sys/arch/i386/i386/machdep.c5
-rw-r--r--sys/arch/macppc/macppc/dma.c5
-rw-r--r--sys/arch/sparc64/sparc64/machdep.c20
3 files changed, 27 insertions, 3 deletions
diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c
index f6541028e97..0416b7bf7cf 100644
--- a/sys/arch/i386/i386/machdep.c
+++ b/sys/arch/i386/i386/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.233 2003/05/27 23:52:01 fgsch Exp $ */
+/* $OpenBSD: machdep.c,v 1.234 2003/06/02 18:14:16 jason Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -3128,6 +3128,9 @@ _bus_dmamap_load_uio(t, map, uio, flags)
resid = uio->uio_resid;
iov = uio->uio_iov;
+ if (resid > map->_dm_size)
+ return (EINVAL);
+
if (uio->uio_segflg == UIO_USERSPACE) {
p = uio->uio_procp;
#ifdef DIAGNOSTIC
diff --git a/sys/arch/macppc/macppc/dma.c b/sys/arch/macppc/macppc/dma.c
index b75c79b9ca6..0445eddb321 100644
--- a/sys/arch/macppc/macppc/dma.c
+++ b/sys/arch/macppc/macppc/dma.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dma.c,v 1.18 2002/12/10 23:41:37 miod Exp $ */
+/* $OpenBSD: dma.c,v 1.19 2003/06/02 18:14:16 jason Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -321,6 +321,9 @@ _dmamap_load_uio(t, map, uio, flags)
resid = uio->uio_resid;
iov = uio->uio_iov;
+ if (resid > map->_dm_size)
+ return (EINVAL);
+
if (uio->uio_segflg == UIO_USERSPACE) {
p = uio->uio_procp;
#ifdef DIAGNOSTIC
diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c
index 1ad9bfae42f..47736c26394 100644
--- a/sys/arch/sparc64/sparc64/machdep.c
+++ b/sys/arch/sparc64/sparc64/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.60 2003/06/01 17:43:50 art Exp $ */
+/* $OpenBSD: machdep.c,v 1.61 2003/06/02 18:14:16 jason Exp $ */
/* $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */
/*-
@@ -1265,6 +1265,15 @@ _bus_dmamap_load_mbuf(t, t0, map, m, flags)
int i;
size_t len;
+ /*
+ * Make sure that on error condition we return "no valid mappings".
+ */
+ map->dm_mapsize = 0;
+ map->dm_nsegs = 0;
+
+ if (m->m_pkthdr.len > map->_dm_size)
+ return (EINVAL);
+
/* Record mbuf for *_unload */
map->_dm_type = _DM_TYPE_MBUF;
map->_dm_source = m;
@@ -1332,6 +1341,15 @@ _bus_dmamap_load_uio(t, t0, map, uio, flags)
int i, j;
size_t len;
+ /*
+ * Make sure that on error condition we return "no valid mappings".
+ */
+ map->dm_mapsize = 0;
+ map->dm_nsegs = 0;
+
+ if (uio->uio_resid > map->_dm_size)
+ return (EINVAL);
+
if (uio->uio_segflg != UIO_SYSSPACE)
return (EOPNOTSUPP);