Author: sbruno
Date: Tue Apr 19 18:27:28 2016
New Revision: 298280
URL: https://svnweb.freebsd.org/changeset/base/298280

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

Modified:
  head/sys/dev/aac/aac.c
  head/sys/dev/aacraid/aacraid.c

Modified: head/sys/dev/aac/aac.c
==============================================================================
--- head/sys/dev/aac/aac.c      Tue Apr 19 16:48:14 2016        (r298279)
+++ head/sys/dev/aac/aac.c      Tue Apr 19 18:27:28 2016        (r298280)
@@ -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: head/sys/dev/aacraid/aacraid.c
==============================================================================
--- head/sys/dev/aacraid/aacraid.c      Tue Apr 19 16:48:14 2016        
(r298279)
+++ head/sys/dev/aacraid/aacraid.c      Tue Apr 19 18:27:28 2016        
(r298280)
@@ -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 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to