OSDN Git Service

net: ionic: Use scnprintf() for avoiding potential buffer overflow
authorTakashi Iwai <tiwai@suse.de>
Sun, 15 Mar 2020 09:35:01 +0000 (10:35 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Mar 2020 00:06:22 +0000 (17:06 -0700)
Since snprintf() returns the would-be-output size instead of the
actual output size, the succeeding calls may go beyond the given
buffer limit.  Fix it by replacing with scnprintf().

Reviewed-by: Simon Horman <simon.horman@netronome.com>
Acked-by: Shannon Nelson <snelson@pensando.io>
Cc: "David S . Miller" <davem@davemloft.net>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: oss-drivers@netronome.com
Cc: netdev@vger.kernel.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_lif.c

index c2f5b69..938e19e 100644 (file)
@@ -948,18 +948,18 @@ static void ionic_lif_rx_mode(struct ionic_lif *lif, unsigned int rx_mode)
        int i;
 #define REMAIN(__x) (sizeof(buf) - (__x))
 
-       i = snprintf(buf, sizeof(buf), "rx_mode 0x%04x -> 0x%04x:",
-                    lif->rx_mode, rx_mode);
+       i = scnprintf(buf, sizeof(buf), "rx_mode 0x%04x -> 0x%04x:",
+                     lif->rx_mode, rx_mode);
        if (rx_mode & IONIC_RX_MODE_F_UNICAST)
-               i += snprintf(&buf[i], REMAIN(i), " RX_MODE_F_UNICAST");
+               i += scnprintf(&buf[i], REMAIN(i), " RX_MODE_F_UNICAST");
        if (rx_mode & IONIC_RX_MODE_F_MULTICAST)
-               i += snprintf(&buf[i], REMAIN(i), " RX_MODE_F_MULTICAST");
+               i += scnprintf(&buf[i], REMAIN(i), " RX_MODE_F_MULTICAST");
        if (rx_mode & IONIC_RX_MODE_F_BROADCAST)
-               i += snprintf(&buf[i], REMAIN(i), " RX_MODE_F_BROADCAST");
+               i += scnprintf(&buf[i], REMAIN(i), " RX_MODE_F_BROADCAST");
        if (rx_mode & IONIC_RX_MODE_F_PROMISC)
-               i += snprintf(&buf[i], REMAIN(i), " RX_MODE_F_PROMISC");
+               i += scnprintf(&buf[i], REMAIN(i), " RX_MODE_F_PROMISC");
        if (rx_mode & IONIC_RX_MODE_F_ALLMULTI)
-               i += snprintf(&buf[i], REMAIN(i), " RX_MODE_F_ALLMULTI");
+               i += scnprintf(&buf[i], REMAIN(i), " RX_MODE_F_ALLMULTI");
        netdev_dbg(lif->netdev, "lif%d %s\n", lif->index, buf);
 
        err = ionic_adminq_post_wait(lif, &ctx);