]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
cxgb3: Avoid potential string truncation in desc
authorKees Cook <keescook@chromium.org>
Tue, 12 Dec 2023 22:09:57 +0000 (14:09 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 14 Dec 2023 02:32:01 +0000 (18:32 -0800)
Builds with W=1 were warning about potential string truncations:

drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c: In function 'cxgb_up':
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c:394:38: warning: '%d' directive output may be truncated writing between 1 and 11 bytes into a region of size between 5 and 20 [-Wformat-truncation=]
  394 |                                  "%s-%d", d->name, pi->first_qset + i);
      |                                      ^~
In function 'name_msix_vecs',
    inlined from 'cxgb_up' at drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c:1264:3: drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c:394:34: note: directive argument in the range [-2147483641, 509]
  394 |                                  "%s-%d", d->name, pi->first_qset + i);
      |                                  ^~~~~~~
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c:393:25: note: 'snprintf' output between 3 and 28 bytes into a destination of size 21
  393 |                         snprintf(adap->msix_info[msi_idx].desc, n,
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  394 |                                  "%s-%d", d->name, pi->first_qset + i);
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Avoid open-coded %NUL-termination (this code was assuming snprintf
wasn't %NUL terminating when it does -- likely thinking of strncpy),
and grow the size of the string to handle a maximal value.

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202312100937.ZPZCARhB-lkp@intel.com/
Cc: Raju Rangoju <rajur@chelsio.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20231212220954.work.219-kees@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/chelsio/cxgb3/adapter.h
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c

index 6d682b7c7aac9f203c7874244acfb74e0753b531..9d11e55981a0fee6dd8de1df74b899a2413b9899 100644 (file)
@@ -237,7 +237,7 @@ struct adapter {
        int msix_nvectors;
        struct {
                unsigned short vec;
-               char desc[22];
+               char desc[IFNAMSIZ + 1 + 12];   /* Needs space for "%s-%d" */
        } msix_info[SGE_QSETS + 1];
 
        /* T3 modules */
index d117022d15d7f73cca002d9fadd697de21de26ba..2236f1d35f2b81189580a53303cb4b0bb630bc48 100644 (file)
@@ -380,19 +380,18 @@ static irqreturn_t t3_async_intr_handler(int irq, void *cookie)
  */
 static void name_msix_vecs(struct adapter *adap)
 {
-       int i, j, msi_idx = 1, n = sizeof(adap->msix_info[0].desc) - 1;
+       int i, j, msi_idx = 1;
 
-       snprintf(adap->msix_info[0].desc, n, "%s", adap->name);
-       adap->msix_info[0].desc[n] = 0;
+       strscpy(adap->msix_info[0].desc, adap->name, sizeof(adap->msix_info[0].desc));
 
        for_each_port(adap, j) {
                struct net_device *d = adap->port[j];
                const struct port_info *pi = netdev_priv(d);
 
                for (i = 0; i < pi->nqsets; i++, msi_idx++) {
-                       snprintf(adap->msix_info[msi_idx].desc, n,
+                       snprintf(adap->msix_info[msi_idx].desc,
+                                sizeof(adap->msix_info[0].desc),
                                 "%s-%d", d->name, pi->first_qset + i);
-                       adap->msix_info[msi_idx].desc[n] = 0;
                }
        }
 }