svn commit: r299193 - in stable/10/sys/dev: aac aacraid

Sean Bruno sbruno at FreeBSD.org
Fri May 6 19:18:46 UTC 2016


Author: sbruno
Date: Fri May  6 19:18:44 2016
New Revision: 299193
URL: https://svnweb.freebsd.org/changeset/base/299193

Log:
  MFC r298280
  
  aacraid(4): Sanely copyin userland pointers and ensure that we don't get
  anything janky from a user. (cturt)
  
  aac(4) landergriffith+freebsdbugzilla at gmail.com pointed out that aac(4)
  had the same issue and handling of pointers, so let's change that too.
  
  PR:		206573
  Submitted by:	cturt at hardenedbsd.org

Modified:
  stable/10/sys/dev/aac/aac.c
  stable/10/sys/dev/aacraid/aacraid.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/aac/aac.c
==============================================================================
--- stable/10/sys/dev/aac/aac.c	Fri May  6 19:14:57 2016	(r299192)
+++ stable/10/sys/dev/aac/aac.c	Fri May  6 19:18:44 2016	(r299193)
@@ -3103,18 +3103,30 @@ aac_ioctl_send_raw_srb(struct aac_softc 
 	/* Retrieve correct SG entries. */
 	if (fibsize == (sizeof(struct aac_srb) +
 	    srbcmd->sg_map.SgCount * sizeof(struct aac_sg_entry))) {
+		struct aac_sg_entry sg;
+
 		sge = srbcmd->sg_map.SgEntry;
 		sge64 = NULL;
-		srb_sg_bytecount = sge->SgByteCount;
-		srb_sg_address = (void *)(uintptr_t)sge->SgAddress;
+
+		if ((error = copyin(sge, &sg, sizeof(sg))) != 0)
+			goto out;
+
+		srb_sg_bytecount = sg.SgByteCount;
+		srb_sg_address = (void *)(uintptr_t)sg.SgAddress;
 	}
 #ifdef __amd64__
 	else if (fibsize == (sizeof(struct aac_srb) +
 	    srbcmd->sg_map.SgCount * sizeof(struct aac_sg_entry64))) {
+		struct aac_sg_entry64 sg;
+
 		sge = NULL;
 		sge64 = (struct aac_sg_entry64 *)srbcmd->sg_map.SgEntry;
-		srb_sg_bytecount = sge64->SgByteCount;
-		srb_sg_address = (void *)sge64->SgAddress;
+
+		if ((error = copyin(sge64, &sg, sizeof(sg))) != 0)
+			goto out;
+
+		srb_sg_bytecount = sg.SgByteCount;
+		srb_sg_address = (void *)sg.SgAddress;
 		if (sge64->SgAddress > 0xffffffffull &&
 		    (sc->flags & AAC_FLAGS_SG_64BIT) == 0) {
 			error = EINVAL;

Modified: stable/10/sys/dev/aacraid/aacraid.c
==============================================================================
--- stable/10/sys/dev/aacraid/aacraid.c	Fri May  6 19:14:57 2016	(r299192)
+++ stable/10/sys/dev/aacraid/aacraid.c	Fri May  6 19:18:44 2016	(r299193)
@@ -2873,15 +2873,25 @@ aac_ioctl_send_raw_srb(struct aac_softc 
 	if (fibsize == (sizeof(struct aac_srb) + 
 		srbcmd->sg_map.SgCount * sizeof(struct aac_sg_entry))) {
 		struct aac_sg_entry *sgp = srbcmd->sg_map.SgEntry;
-		srb_sg_bytecount = sgp->SgByteCount;
-		srb_sg_address = (u_int64_t)sgp->SgAddress;
+		struct aac_sg_entry sg;
+
+		if ((error = copyin(sgp, &sg, sizeof(sg))) != 0)
+			goto out;
+
+		srb_sg_bytecount = sg.SgByteCount;
+		srb_sg_address = (u_int64_t)sg.SgAddress;
 	} else if (fibsize == (sizeof(struct aac_srb) + 
 		srbcmd->sg_map.SgCount * sizeof(struct aac_sg_entry64))) {
 #ifdef __LP64__
 		struct aac_sg_entry64 *sgp = 
 			(struct aac_sg_entry64 *)srbcmd->sg_map.SgEntry;
-		srb_sg_bytecount = sgp->SgByteCount;
-		srb_sg_address = sgp->SgAddress;
+		struct aac_sg_entry64 sg;
+
+		if ((error = copyin(sgp, &sg, sizeof(sg))) != 0)
+			goto out;
+
+		srb_sg_bytecount = sg.SgByteCount;
+		srb_sg_address = sg.SgAddress;
 		if (srb_sg_address > 0xffffffffull && 
 			!(sc->flags & AAC_FLAGS_SG_64BIT))
 #endif	


More information about the svn-src-all mailing list