]> git.dujemihanovic.xyz Git - linux.git/commitdiff
octeontx2-pf: Treat truncation of IRQ name as an error
authorSimon Horman <horms@kernel.org>
Fri, 3 May 2024 11:11:58 +0000 (12:11 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 May 2024 02:07:34 +0000 (19:07 -0700)
According to GCC, the constriction of irq_name in otx2_open()
may, theoretically, be truncated.

This patch takes the approach of treating such a situation as an error
which it detects by making use of the return value of snprintf, which is
the total number of bytes, excluding the trailing '\0', that would have
been written.

Based on the approach taken to a similar problem in
commit 54b909436ede ("rtc: fix snprintf() checking in is_rtc_hctosys()")

Flagged by gcc-13 W=1 builds as:

.../otx2_pf.c:1933:58: warning: 'snprintf' output may be truncated before the last format character [-Wformat-truncation=]
 1933 |                 snprintf(irq_name, NAME_SIZE, "%s-rxtx-%d", pf->netdev->name,
      |                                                          ^
.../otx2_pf.c:1933:17: note: 'snprintf' output between 8 and 33 bytes into a destination of size 32
 1933 |                 snprintf(irq_name, NAME_SIZE, "%s-rxtx-%d", pf->netdev->name,
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 1934 |                          qidx);
      |                          ~~~~~

Compile tested only.

Tested-by: Geetha sowjanya <gakula@marvell.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20240503-octeon2-pf-irq_name-truncation-v2-1-91099177b942@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c

index 6a44dacff508d307dfa707654cf083a8238f8c19..14bccff0ee5c76a770075258f7329ca6ecb66831 100644 (file)
@@ -1886,9 +1886,17 @@ int otx2_open(struct net_device *netdev)
        vec = pf->hw.nix_msixoff + NIX_LF_CINT_VEC_START;
        for (qidx = 0; qidx < pf->hw.cint_cnt; qidx++) {
                irq_name = &pf->hw.irq_name[vec * NAME_SIZE];
+               int name_len;
 
-               snprintf(irq_name, NAME_SIZE, "%s-rxtx-%d", pf->netdev->name,
-                        qidx);
+               name_len = snprintf(irq_name, NAME_SIZE, "%s-rxtx-%d",
+                                   pf->netdev->name, qidx);
+               if (name_len >= NAME_SIZE) {
+                       dev_err(pf->dev,
+                               "RVUPF%d: IRQ registration failed for CQ%d, irq name is too long\n",
+                               rvu_get_pf(pf->pcifunc), qidx);
+                       err = -EINVAL;
+                       goto err_free_cints;
+               }
 
                err = request_irq(pci_irq_vector(pf->pdev, vec),
                                  otx2_cq_intr_handler, 0, irq_name,