| From cfb41f412b535fa8195d7283cc6c9f6c814b46a6 Mon Sep 17 00:00:00 2001 |
| From: James Smart <jsmart2021@gmail.com> |
| Date: Wed, 18 Dec 2019 15:58:00 -0800 |
| Subject: [PATCH] scsi: lpfc: Fix: Rework setting of fdmi symbolic node name |
| registration |
| |
| commit df9166bfa7750bade5737ffc91fbd432e0354442 upstream. |
| |
| 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c |
| index 4812bbbf43cc..fe2565999527 100644 |
| --- a/drivers/scsi/lpfc/lpfc_ct.c |
| +++ b/drivers/scsi/lpfc/lpfc_ct.c |
| @@ -1439,33 +1439,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 |
| -- |
| 2.7.4 |
| |