lkml.org 
[lkml]   [2020]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.5 250/542] scsi: lpfc: Fix: Rework setting of fdmi symbolic node name registration
    Date
    From: James Smart <jsmart2021@gmail.com>

    [ Upstream commit df9166bfa7750bade5737ffc91fbd432e0354442 ]

    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: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/lpfc/lpfc_ct.c | 42 +++++++++++++++++++------------------
    1 file changed, 22 insertions(+), 20 deletions(-)

    diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c
    index 99c9bb249758c..1b4dbb28fb419 100644
    --- a/drivers/scsi/lpfc/lpfc_ct.c
    +++ b/drivers/scsi/lpfc/lpfc_ct.c
    @@ -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
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-02-14 16:54    [W:7.400 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site