]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
scsi: lpfc: Fix: Rework setting of fdmi symbolic node name registration
authorJames Smart <jsmart2021@gmail.com>
Wed, 18 Dec 2019 23:58:00 +0000 (15:58 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 21 Dec 2019 18:42:41 +0000 (13:42 -0500)
This patch reworks the fdmi symbolic node name data for the following two
issues:

 - Correcting extraneous periods following the DV and HN fdmi data fields.

 - Avoiding buffer overflow issues when formatting the data.

The fix to the fist issue is to just remove the characters.

The fix to the second issue has all data being staged in temporary storage
before being moved to the real buffer.

Link: https://lore.kernel.org/r/20191218235808.31922-3-jsmart2021@gmail.com
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_ct.c

index 99c9bb249758c3e69d1a008100097a00b9e64471..1b4dbb28fb4194b4e86c3a2edcec68b4e3283efa 100644 (file)
@@ -1493,33 +1493,35 @@ int
 lpfc_vport_symbolic_node_name(struct lpfc_vport *vport, char *symbol,
        size_t size)
 {
-       char fwrev[FW_REV_STR_SIZE];
-       int n;
+       char fwrev[FW_REV_STR_SIZE] = {0};
+       char tmp[MAXHOSTNAMELEN] = {0};
 
-       lpfc_decode_firmware_rev(vport->phba, fwrev, 0);
+       memset(symbol, 0, size);
 
-       n = scnprintf(symbol, size, "Emulex %s", vport->phba->ModelName);
-       if (size < n)
-               return n;
+       scnprintf(tmp, sizeof(tmp), "Emulex %s", vport->phba->ModelName);
+       if (strlcat(symbol, tmp, size) >= size)
+               goto buffer_done;
 
-       n += scnprintf(symbol + n, size - n, " FV%s", fwrev);
-       if (size < n)
-               return n;
+       lpfc_decode_firmware_rev(vport->phba, fwrev, 0);
+       scnprintf(tmp, sizeof(tmp), " FV%s", fwrev);
+       if (strlcat(symbol, tmp, size) >= size)
+               goto buffer_done;
 
-       n += scnprintf(symbol + n, size - n, " DV%s.",
-                     lpfc_release_version);
-       if (size < n)
-               return n;
+       scnprintf(tmp, sizeof(tmp), " DV%s", lpfc_release_version);
+       if (strlcat(symbol, tmp, size) >= size)
+               goto buffer_done;
 
-       n += scnprintf(symbol + n, size - n, " HN:%s.",
-                     init_utsname()->nodename);
-       if (size < n)
-               return n;
+       scnprintf(tmp, sizeof(tmp), " HN:%s", init_utsname()->nodename);
+       if (strlcat(symbol, tmp, size) >= size)
+               goto buffer_done;
 
        /* Note :- OS name is "Linux" */
-       n += scnprintf(symbol + n, size - n, " OS:%s",
-                     init_utsname()->sysname);
-       return n;
+       scnprintf(tmp, sizeof(tmp), " OS:%s", init_utsname()->sysname);
+       strlcat(symbol, tmp, size);
+
+buffer_done:
+       return strnlen(symbol, size);
+
 }
 
 static uint32_t