]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: aacraid: struct {user,}sgmap{,64,raw}: Replace 1-element arrays with flexible...
authorKees Cook <kees@kernel.org>
Thu, 11 Jul 2024 21:57:38 +0000 (14:57 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 3 Aug 2024 01:38:08 +0000 (21:38 -0400)
Replace the deprecated[1] use of 1-element arrays in struct sgmap, struct
sgmap64, struct sgmapraw, struct user_sgmap, and struct user_sgmap64 with
modern flexible arrays. Additionally remove struct user_sgmapraw as it is
unused.

The resulting binary output differences from this change are limited only
to stack space consumption of the smaller "srbu" variable in
aac_issue_safw_bmic_identify() and aac_get_safw_ciss_luns(), as well as the
smaller associated pair of memcpy()s in
aac_send_safw_bmic_cmd(). Artificially growing the size of srbu back to its
prior size removes all binary differences[2].

As an aside, after studying the aacraid driver code I wonder how
aac_send_wellness_command() ever works. It is reporting a size 4 bytes too
small for what it has constructed in memory in the DMA region: sgentry64 is
size 12, whereas sgentry is size 8. Perhaps the hardware doesn't
care. (Regardless, it is unchanged by this patch.)

Link: https://github.com/KSPP/linux/issues/79
Link: https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/commit/?h=dev/v6.10-rc2/1-element&id=45e6226bcbc5e982541754eca7ac29f403e82f5e
Signed-off-by: Kees Cook <kees@kernel.org>
Link: https://lore.kernel.org/r/20240711215739.208776-2-kees@kernel.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/commctrl.c
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/commsup.c

index b22857c6f3f4f93b92f3e1929a12ffb1084e8b64..6a7159badebb12ef76815a18e86085a7695ef968 100644 (file)
@@ -1267,7 +1267,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
                        return ret;
                command = ContainerRawIo;
                fibsize = sizeof(struct aac_raw_io) +
-                       ((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
+                       (le32_to_cpu(readcmd->sg.count) * sizeof(struct sgentryraw));
        }
 
        BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
@@ -1302,7 +1302,7 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
        if (ret < 0)
                return ret;
        fibsize = sizeof(struct aac_read64) +
-               ((le32_to_cpu(readcmd->sg.count) - 1) *
+               (le32_to_cpu(readcmd->sg.count) *
                 sizeof (struct sgentry64));
        BUG_ON (fibsize > (fib->dev->max_fib_size -
                                sizeof(struct aac_fibhdr)));
@@ -1337,7 +1337,7 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
        if (ret < 0)
                return ret;
        fibsize = sizeof(struct aac_read) +
-                       ((le32_to_cpu(readcmd->sg.count) - 1) *
+                       (le32_to_cpu(readcmd->sg.count) *
                         sizeof (struct sgentry));
        BUG_ON (fibsize > (fib->dev->max_fib_size -
                                sizeof(struct aac_fibhdr)));
@@ -1401,7 +1401,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
                        return ret;
                command = ContainerRawIo;
                fibsize = sizeof(struct aac_raw_io) +
-                       ((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
+                       (le32_to_cpu(writecmd->sg.count) * sizeof(struct sgentryraw));
        }
 
        BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
@@ -1436,7 +1436,7 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
        if (ret < 0)
                return ret;
        fibsize = sizeof(struct aac_write64) +
-               ((le32_to_cpu(writecmd->sg.count) - 1) *
+               (le32_to_cpu(writecmd->sg.count) *
                 sizeof (struct sgentry64));
        BUG_ON (fibsize > (fib->dev->max_fib_size -
                                sizeof(struct aac_fibhdr)));
@@ -1473,7 +1473,7 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
        if (ret < 0)
                return ret;
        fibsize = sizeof(struct aac_write) +
-               ((le32_to_cpu(writecmd->sg.count) - 1) *
+               (le32_to_cpu(writecmd->sg.count) *
                 sizeof (struct sgentry));
        BUG_ON (fibsize > (fib->dev->max_fib_size -
                                sizeof(struct aac_fibhdr)));
@@ -1592,9 +1592,9 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
        /*
         *      Build Scatter/Gather list
         */
-       fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
+       fibsize = sizeof(struct aac_srb) +
                ((le32_to_cpu(srbcmd->sg.count) & 0xff) *
-                sizeof (struct sgentry64));
+                sizeof(struct sgentry64));
        BUG_ON (fibsize > (fib->dev->max_fib_size -
                                sizeof(struct aac_fibhdr)));
 
@@ -1624,7 +1624,7 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
         *      Build Scatter/Gather list
         */
        fibsize = sizeof (struct aac_srb) +
-               (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
+               ((le32_to_cpu(srbcmd->sg.count) & 0xff) *
                 sizeof (struct sgentry));
        BUG_ON (fibsize > (fib->dev->max_fib_size -
                                sizeof(struct aac_fibhdr)));
@@ -1693,8 +1693,7 @@ static int aac_send_safw_bmic_cmd(struct aac_dev *dev,
        fibptr->hw_fib_va->header.XferState &=
                ~cpu_to_le32(FastResponseCapable);
 
-       fibsize  = sizeof(struct aac_srb) - sizeof(struct sgentry) +
-                                               sizeof(struct sgentry64);
+       fibsize = sizeof(struct aac_srb) + sizeof(struct sgentry64);
 
        /* allocate DMA buffer for response */
        addr = dma_map_single(&dev->pdev->dev, xfer_buf, xfer_len,
@@ -2267,7 +2266,7 @@ int aac_get_adapter_info(struct aac_dev* dev)
                dev->a_ops.adapter_bounds = aac_bounds_32;
                dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
                        sizeof(struct aac_fibhdr) -
-                       sizeof(struct aac_write) + sizeof(struct sgentry)) /
+                       sizeof(struct aac_write)) /
                                sizeof(struct sgentry);
                if (dev->dac_support) {
                        dev->a_ops.adapter_read = aac_read_block64;
@@ -2278,8 +2277,7 @@ int aac_get_adapter_info(struct aac_dev* dev)
                        dev->scsi_host_ptr->sg_tablesize =
                                (dev->max_fib_size -
                                sizeof(struct aac_fibhdr) -
-                               sizeof(struct aac_write64) +
-                               sizeof(struct sgentry64)) /
+                               sizeof(struct aac_write64)) /
                                        sizeof(struct sgentry64);
                } else {
                        dev->a_ops.adapter_read = aac_read_block;
index 9b66fa29fb05ca6b2ef58ba7fd3dc1a6af2bf1f7..63e74266d7a2121f31e21480fe9d0318eded2fc7 100644 (file)
@@ -507,32 +507,27 @@ struct sge_ieee1212 {
 
 struct sgmap {
        __le32          count;
-       struct sgentry  sg[1];
+       struct sgentry  sg[];
 };
 
 struct user_sgmap {
        u32             count;
-       struct user_sgentry     sg[1];
+       struct user_sgentry     sg[];
 };
 
 struct sgmap64 {
        __le32          count;
-       struct sgentry64 sg[1];
+       struct sgentry64 sg[];
 };
 
 struct user_sgmap64 {
        u32             count;
-       struct user_sgentry64 sg[1];
+       struct user_sgentry64 sg[];
 };
 
 struct sgmapraw {
        __le32            count;
-       struct sgentryraw sg[1];
-};
-
-struct user_sgmapraw {
-       u32               count;
-       struct user_sgentryraw sg[1];
+       struct sgentryraw sg[];
 };
 
 struct creation_info
index e7cc927ed952dd901843685f38501b8928500c35..68240d6f27abe32e7c7bc09df0b8d7680b56d6fa 100644 (file)
@@ -523,7 +523,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
                goto cleanup;
        }
 
-       if ((fibsize < (sizeof(struct user_aac_srb) - sizeof(struct user_sgentry))) ||
+       if ((fibsize < sizeof(struct user_aac_srb)) ||
            (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)))) {
                rcode = -EINVAL;
                goto cleanup;
@@ -561,7 +561,7 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
                rcode = -EINVAL;
                goto cleanup;
        }
-       actual_fibsize = sizeof(struct aac_srb) - sizeof(struct sgentry) +
+       actual_fibsize = sizeof(struct aac_srb) +
                ((user_srbcmd->sg.count & 0xff) * sizeof(struct sgentry));
        actual_fibsize64 = actual_fibsize + (user_srbcmd->sg.count & 0xff) *
          (sizeof(struct sgentry64) - sizeof(struct sgentry));
index bd99c5492b7d49440705e9eb0470d820557a18e2..fee857236991f57c9d67f8ea78a19fb58e88f771 100644 (file)
@@ -522,8 +522,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
        spin_lock_init(&dev->iq_lock);
        dev->max_fib_size = sizeof(struct hw_fib);
        dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
-               - sizeof(struct aac_fibhdr)
-               - sizeof(struct aac_write) + sizeof(struct sgentry))
+               - sizeof(struct aac_fibhdr) - sizeof(struct aac_write))
                        / sizeof(struct sgentry);
        dev->comm_interface = AAC_COMM_PRODUCER;
        dev->raw_io_interface = dev->raw_io_64 = 0;
index 25cee03d7f9737f9314a9497b7369439ca5cbd61..47287559c768f379b9c685328dff7e963e81b995 100644 (file)
@@ -2327,8 +2327,9 @@ static int aac_send_wellness_command(struct aac_dev *dev, char *wellness_str,
        sg64->sg[0].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff));
        sg64->sg[0].count = cpu_to_le32(datasize);
 
-       ret = aac_fib_send(ScsiPortCommand64, fibptr, sizeof(struct aac_srb),
-                               FsaNormal, 1, 1, NULL, NULL);
+       ret = aac_fib_send(ScsiPortCommand64, fibptr,
+                          sizeof(struct aac_srb) + sizeof(struct sgentry),
+                          FsaNormal, 1, 1, NULL, NULL);
 
        dma_free_coherent(&dev->pdev->dev, datasize, dma_buf, addr);