]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: endpoint: pci-epf-vntb: Use array_index_nospec() on mws_size[] access
authorKoichiro Den <den@valinux.co.jp>
Mon, 5 Jan 2026 07:56:06 +0000 (16:56 +0900)
committerManivannan Sadhasivam <mani@kernel.org>
Tue, 24 Feb 2026 10:33:39 +0000 (16:03 +0530)
Follow common kernel idioms for indices derived from configfs attributes
and suppress Smatch warnings:

  epf_ntb_mw1_show() warn: potential spectre issue 'ntb->mws_size' [r]
  epf_ntb_mw1_store() warn: potential spectre issue 'ntb->mws_size' [w]

Also fix the error message for out-of-range MW indices and %lld format
for unsigned values.

Signed-off-by: Koichiro Den <den@valinux.co.jp>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260105075606.1253697-1-den@valinux.co.jp
drivers/pci/endpoint/functions/pci-epf-vntb.c

index 52cf442ca1d9aadf2472bfc5a10462b920d29618..71a35f575cc1de7f0be56211d9a8b50f3bc10785 100644 (file)
@@ -995,17 +995,19 @@ static ssize_t epf_ntb_##_name##_show(struct config_item *item,           \
        struct config_group *group = to_config_group(item);             \
        struct epf_ntb *ntb = to_epf_ntb(group);                        \
        struct device *dev = &ntb->epf->dev;                            \
-       int win_no;                                                     \
+       int win_no, idx;                                                \
                                                                        \
        if (sscanf(#_name, "mw%d", &win_no) != 1)                       \
                return -EINVAL;                                         \
                                                                        \
-       if (win_no <= 0 || win_no > ntb->num_mws) {                     \
-               dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
+       idx = win_no - 1;                                               \
+       if (idx < 0 || idx >= ntb->num_mws) {                           \
+               dev_err(dev, "MW%d out of range (num_mws=%d)\n",        \
+                       win_no, ntb->num_mws);                          \
                return -EINVAL;                                         \
        }                                                               \
-                                                                       \
-       return sprintf(page, "%lld\n", ntb->mws_size[win_no - 1]);      \
+       idx = array_index_nospec(idx, ntb->num_mws);                    \
+       return sprintf(page, "%llu\n", ntb->mws_size[idx]);             \
 }
 
 #define EPF_NTB_MW_W(_name)                                            \
@@ -1015,7 +1017,7 @@ static ssize_t epf_ntb_##_name##_store(struct config_item *item,  \
        struct config_group *group = to_config_group(item);             \
        struct epf_ntb *ntb = to_epf_ntb(group);                        \
        struct device *dev = &ntb->epf->dev;                            \
-       int win_no;                                                     \
+       int win_no, idx;                                                \
        u64 val;                                                        \
        int ret;                                                        \
                                                                        \
@@ -1026,12 +1028,14 @@ static ssize_t epf_ntb_##_name##_store(struct config_item *item,        \
        if (sscanf(#_name, "mw%d", &win_no) != 1)                       \
                return -EINVAL;                                         \
                                                                        \
-       if (win_no <= 0 || win_no > ntb->num_mws) {                     \
-               dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
+       idx = win_no - 1;                                               \
+       if (idx < 0 || idx >= ntb->num_mws) {                           \
+               dev_err(dev, "MW%d out of range (num_mws=%d)\n",        \
+                       win_no, ntb->num_mws);                          \
                return -EINVAL;                                         \
        }                                                               \
-                                                                       \
-       ntb->mws_size[win_no - 1] = val;                                \
+       idx = array_index_nospec(idx, ntb->num_mws);                    \
+       ntb->mws_size[idx] = val;                                       \
                                                                        \
        return len;                                                     \
 }