ionic: check for binary values in FW ver string
authorShannon Nelson <snelson@pensando.io>
Fri, 1 Oct 2021 18:05:52 +0000 (11:05 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 2 Oct 2021 13:00:21 +0000 (14:00 +0100)
If the PCI connection is broken, reading the FW version string
will only get 0xff bytes, which shouldn't get printed.  This
checks the first byte and prints only the first 4 bytes
if non-ASCII.

Also, add a limit to the string length printed when a valid
string is found, just in case it is not properly terminated.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_main.c

index 6f07bf5..b6473c0 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/netdevice.h>
 #include <linux/utsname.h>
 #include <generated/utsrelease.h>
+#include <linux/ctype.h>
 
 #include "ionic.h"
 #include "ionic_bus.h"
@@ -450,13 +451,23 @@ int ionic_identify(struct ionic *ionic)
        }
        mutex_unlock(&ionic->dev_cmd_lock);
 
-       dev_info(ionic->dev, "FW: %s\n", idev->dev_info.fw_version);
-
        if (err) {
-               dev_err(ionic->dev, "Cannot identify ionic: %dn", err);
+               dev_err(ionic->dev, "Cannot identify ionic: %d\n", err);
                goto err_out;
        }
 
+       if (isprint(idev->dev_info.fw_version[0]) &&
+           isascii(idev->dev_info.fw_version[0]))
+               dev_info(ionic->dev, "FW: %.*s\n",
+                        (int)(sizeof(idev->dev_info.fw_version) - 1),
+                        idev->dev_info.fw_version);
+       else
+               dev_info(ionic->dev, "FW: (invalid string) 0x%02x 0x%02x 0x%02x 0x%02x ...\n",
+                        (u8)idev->dev_info.fw_version[0],
+                        (u8)idev->dev_info.fw_version[1],
+                        (u8)idev->dev_info.fw_version[2],
+                        (u8)idev->dev_info.fw_version[3]);
+
        err = ionic_lif_identify(ionic, IONIC_LIF_TYPE_CLASSIC,
                                 &ionic->ident.lif);
        if (err) {