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+freebsdbugzi...@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: ct...@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 
_______________________________________________
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