Re: [PATCH] scsi: bfa: Replace all non-returning strlcpy with strscpy

From: Azeem Shaikh
Date: Mon May 15 2023 - 22:02:29 EST


cc linux-hardening@xxxxxxxxxxxxxxx

On Mon, May 15, 2023 at 9:35 PM Azeem Shaikh <azeemshaikh38@xxxxxxxxx> wrote:
>
> strlcpy() reads the entire source buffer first.
> This read may exceed the destination size limit.
> This is both inefficient and can lead to linear read
> overflows if a source string is not NUL-terminated [1].
> In an effort to remove strlcpy() completely [2], replace
> strlcpy() here with strscpy().
> No return values were used, so direct replacement is safe.
>
> [1] https://www.kernel.org/doc/html/latest/process/deprecated.html#strlcpy
> [2] https://github.com/KSPP/linux/issues/89
>
> Signed-off-by: Azeem Shaikh <azeemshaikh38@xxxxxxxxx>
> ---
> drivers/scsi/bfa/bfa_fcbuild.c | 4 ++--
> drivers/scsi/bfa/bfa_fcs.c | 4 ++--
> drivers/scsi/bfa/bfa_fcs_lport.c | 20 ++++++++++----------
> drivers/scsi/bfa/bfa_ioc.c | 2 +-
> drivers/scsi/bfa/bfa_svc.c | 2 +-
> drivers/scsi/bfa/bfad.c | 10 +++++-----
> drivers/scsi/bfa/bfad_attr.c | 2 +-
> drivers/scsi/bfa/bfad_bsg.c | 4 ++--
> drivers/scsi/bfa/bfad_im.c | 2 +-
> 9 files changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/scsi/bfa/bfa_fcbuild.c b/drivers/scsi/bfa/bfa_fcbuild.c
> index df18d9d2af53..773c84af784c 100644
> --- a/drivers/scsi/bfa/bfa_fcbuild.c
> +++ b/drivers/scsi/bfa/bfa_fcbuild.c
> @@ -1134,7 +1134,7 @@ fc_rspnid_build(struct fchs_s *fchs, void *pyld, u32 s_id, u16 ox_id,
> memset(rspnid, 0, sizeof(struct fcgs_rspnid_req_s));
>
> rspnid->dap = s_id;
> - strlcpy(rspnid->spn, name, sizeof(rspnid->spn));
> + strscpy(rspnid->spn, name, sizeof(rspnid->spn));
> rspnid->spn_len = (u8) strlen(rspnid->spn);
>
> return sizeof(struct fcgs_rspnid_req_s) + sizeof(struct ct_hdr_s);
> @@ -1155,7 +1155,7 @@ fc_rsnn_nn_build(struct fchs_s *fchs, void *pyld, u32 s_id,
> memset(rsnn_nn, 0, sizeof(struct fcgs_rsnn_nn_req_s));
>
> rsnn_nn->node_name = node_name;
> - strlcpy(rsnn_nn->snn, name, sizeof(rsnn_nn->snn));
> + strscpy(rsnn_nn->snn, name, sizeof(rsnn_nn->snn));
> rsnn_nn->snn_len = (u8) strlen(rsnn_nn->snn);
>
> return sizeof(struct fcgs_rsnn_nn_req_s) + sizeof(struct ct_hdr_s);
> diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c
> index d2d396ca0e9a..5023c0ab4277 100644
> --- a/drivers/scsi/bfa/bfa_fcs.c
> +++ b/drivers/scsi/bfa/bfa_fcs.c
> @@ -761,7 +761,7 @@ bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric)
> bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model);
>
> /* Model name/number */
> - strlcpy(port_cfg->sym_name.symname, model,
> + strscpy(port_cfg->sym_name.symname, model,
> BFA_SYMNAME_MAXLEN);
> strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
> BFA_SYMNAME_MAXLEN);
> @@ -822,7 +822,7 @@ bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric)
> bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model);
>
> /* Model name/number */
> - strlcpy(port_cfg->node_sym_name.symname, model,
> + strscpy(port_cfg->node_sym_name.symname, model,
> BFA_SYMNAME_MAXLEN);
> strlcat(port_cfg->node_sym_name.symname,
> BFA_FCS_PORT_SYMBNAME_SEPARATOR,
> diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c
> index b12afcc4b189..008afd817087 100644
> --- a/drivers/scsi/bfa/bfa_fcs_lport.c
> +++ b/drivers/scsi/bfa/bfa_fcs_lport.c
> @@ -2642,10 +2642,10 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_lport_fdmi_s *fdmi,
> bfa_ioc_get_adapter_fw_ver(&port->fcs->bfa->ioc,
> hba_attr->fw_version);
>
> - strlcpy(hba_attr->driver_version, (char *)driver_info->version,
> + strscpy(hba_attr->driver_version, (char *)driver_info->version,
> sizeof(hba_attr->driver_version));
>
> - strlcpy(hba_attr->os_name, driver_info->host_os_name,
> + strscpy(hba_attr->os_name, driver_info->host_os_name,
> sizeof(hba_attr->os_name));
>
> /*
> @@ -2663,13 +2663,13 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_lport_fdmi_s *fdmi,
> bfa_fcs_fdmi_get_portattr(fdmi, &fcs_port_attr);
> hba_attr->max_ct_pyld = fcs_port_attr.max_frm_size;
>
> - strlcpy(hba_attr->node_sym_name.symname,
> + strscpy(hba_attr->node_sym_name.symname,
> port->port_cfg.node_sym_name.symname, BFA_SYMNAME_MAXLEN);
> strcpy(hba_attr->vendor_info, "QLogic");
> hba_attr->num_ports =
> cpu_to_be32(bfa_ioc_get_nports(&port->fcs->bfa->ioc));
> hba_attr->fabric_name = port->fabric->lps->pr_nwwn;
> - strlcpy(hba_attr->bios_ver, hba_attr->option_rom_ver, BFA_VERSION_LEN);
> + strscpy(hba_attr->bios_ver, hba_attr->option_rom_ver, BFA_VERSION_LEN);
>
> }
>
> @@ -2736,19 +2736,19 @@ bfa_fcs_fdmi_get_portattr(struct bfa_fcs_lport_fdmi_s *fdmi,
> /*
> * OS device Name
> */
> - strlcpy(port_attr->os_device_name, driver_info->os_device_name,
> + strscpy(port_attr->os_device_name, driver_info->os_device_name,
> sizeof(port_attr->os_device_name));
>
> /*
> * Host name
> */
> - strlcpy(port_attr->host_name, driver_info->host_machine_name,
> + strscpy(port_attr->host_name, driver_info->host_machine_name,
> sizeof(port_attr->host_name));
>
> port_attr->node_name = bfa_fcs_lport_get_nwwn(port);
> port_attr->port_name = bfa_fcs_lport_get_pwwn(port);
>
> - strlcpy(port_attr->port_sym_name.symname,
> + strscpy(port_attr->port_sym_name.symname,
> bfa_fcs_lport_get_psym_name(port).symname, BFA_SYMNAME_MAXLEN);
> bfa_fcs_lport_get_attr(port, &lport_attr);
> port_attr->port_type = cpu_to_be32(lport_attr.port_type);
> @@ -3229,7 +3229,7 @@ bfa_fcs_lport_ms_gmal_response(void *fcsarg, struct bfa_fcxp_s *fcxp,
> rsp_str[gmal_entry->len-1] = 0;
>
> /* copy IP Address to fabric */
> - strlcpy(bfa_fcs_lport_get_fabric_ipaddr(port),
> + strscpy(bfa_fcs_lport_get_fabric_ipaddr(port),
> gmal_entry->ip_addr,
> BFA_FCS_FABRIC_IPADDR_SZ);
> break;
> @@ -4667,7 +4667,7 @@ bfa_fcs_lport_ns_send_rspn_id(void *ns_cbarg, struct bfa_fcxp_s *fcxp_alloced)
> * to that of the base port.
> */
>
> - strlcpy(symbl,
> + strscpy(symbl,
> (char *)&(bfa_fcs_lport_get_psym_name
> (bfa_fcs_get_base_port(port->fcs))),
> sizeof(symbl));
> @@ -5194,7 +5194,7 @@ bfa_fcs_lport_ns_util_send_rspn_id(void *cbarg, struct bfa_fcxp_s *fcxp_alloced)
> * For Vports, we append the vport's port symbolic name
> * to that of the base port.
> */
> - strlcpy(symbl, (char *)&(bfa_fcs_lport_get_psym_name
> + strscpy(symbl, (char *)&(bfa_fcs_lport_get_psym_name
> (bfa_fcs_get_base_port(port->fcs))),
> sizeof(symbl));
>
> diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c
> index 5740302d83ac..e1ed1424fddb 100644
> --- a/drivers/scsi/bfa/bfa_ioc.c
> +++ b/drivers/scsi/bfa/bfa_ioc.c
> @@ -2788,7 +2788,7 @@ void
> bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer)
> {
> memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN);
> - strlcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
> + strscpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
> }
>
> void
> diff --git a/drivers/scsi/bfa/bfa_svc.c b/drivers/scsi/bfa/bfa_svc.c
> index 4e3cef02f10f..c9745c0b4eee 100644
> --- a/drivers/scsi/bfa/bfa_svc.c
> +++ b/drivers/scsi/bfa/bfa_svc.c
> @@ -330,7 +330,7 @@ bfa_plog_str(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
> lp.eid = event;
> lp.log_type = BFA_PL_LOG_TYPE_STRING;
> lp.misc = misc;
> - strlcpy(lp.log_entry.string_log, log_str,
> + strscpy(lp.log_entry.string_log, log_str,
> BFA_PL_STRING_LOG_SZ);
> lp.log_entry.string_log[BFA_PL_STRING_LOG_SZ - 1] = '\0';
> bfa_plog_add(plog, &lp);
> diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c
> index 529b73a83d69..62cb7a864fd5 100644
> --- a/drivers/scsi/bfa/bfad.c
> +++ b/drivers/scsi/bfa/bfad.c
> @@ -965,19 +965,19 @@ bfad_start_ops(struct bfad_s *bfad) {
>
> /* Fill the driver_info info to fcs*/
> memset(&driver_info, 0, sizeof(driver_info));
> - strlcpy(driver_info.version, BFAD_DRIVER_VERSION,
> + strscpy(driver_info.version, BFAD_DRIVER_VERSION,
> sizeof(driver_info.version));
> if (host_name)
> - strlcpy(driver_info.host_machine_name, host_name,
> + strscpy(driver_info.host_machine_name, host_name,
> sizeof(driver_info.host_machine_name));
> if (os_name)
> - strlcpy(driver_info.host_os_name, os_name,
> + strscpy(driver_info.host_os_name, os_name,
> sizeof(driver_info.host_os_name));
> if (os_patch)
> - strlcpy(driver_info.host_os_patch, os_patch,
> + strscpy(driver_info.host_os_patch, os_patch,
> sizeof(driver_info.host_os_patch));
>
> - strlcpy(driver_info.os_device_name, bfad->pci_name,
> + strscpy(driver_info.os_device_name, bfad->pci_name,
> sizeof(driver_info.os_device_name));
>
> /* FCS driver info init */
> diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c
> index 5a85401e9e2d..e96e4b6df265 100644
> --- a/drivers/scsi/bfa/bfad_attr.c
> +++ b/drivers/scsi/bfa/bfad_attr.c
> @@ -834,7 +834,7 @@ bfad_im_symbolic_name_show(struct device *dev, struct device_attribute *attr,
> char symname[BFA_SYMNAME_MAXLEN];
>
> bfa_fcs_lport_get_attr(&bfad->bfa_fcs.fabric.bport, &port_attr);
> - strlcpy(symname, port_attr.port_cfg.sym_name.symname,
> + strscpy(symname, port_attr.port_cfg.sym_name.symname,
> BFA_SYMNAME_MAXLEN);
> return sysfs_emit(buf, "%s\n", symname);
> }
> diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c
> index 79d4f7ee5bcb..520f9152f3bf 100644
> --- a/drivers/scsi/bfa/bfad_bsg.c
> +++ b/drivers/scsi/bfa/bfad_bsg.c
> @@ -119,7 +119,7 @@ bfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd)
>
> /* fill in driver attr info */
> strcpy(iocmd->ioc_attr.driver_attr.driver, BFAD_DRIVER_NAME);
> - strlcpy(iocmd->ioc_attr.driver_attr.driver_ver,
> + strscpy(iocmd->ioc_attr.driver_attr.driver_ver,
> BFAD_DRIVER_VERSION, BFA_VERSION_LEN);
> strcpy(iocmd->ioc_attr.driver_attr.fw_ver,
> iocmd->ioc_attr.adapter_attr.fw_ver);
> @@ -307,7 +307,7 @@ bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
> iocmd->attr.port_type = port_attr.port_type;
> iocmd->attr.loopback = port_attr.loopback;
> iocmd->attr.authfail = port_attr.authfail;
> - strlcpy(iocmd->attr.port_symname.symname,
> + strscpy(iocmd->attr.port_symname.symname,
> port_attr.port_cfg.sym_name.symname,
> sizeof(iocmd->attr.port_symname.symname));
>
> diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c
> index c335f7a188d2..a9d3d8562d3c 100644
> --- a/drivers/scsi/bfa/bfad_im.c
> +++ b/drivers/scsi/bfa/bfad_im.c
> @@ -1046,7 +1046,7 @@ bfad_fc_host_init(struct bfad_im_port_s *im_port)
> /* For fibre channel services type 0x20 */
> fc_host_supported_fc4s(host)[7] = 1;
>
> - strlcpy(symname, bfad->bfa_fcs.fabric.bport.port_cfg.sym_name.symname,
> + strscpy(symname, bfad->bfa_fcs.fabric.bport.port_cfg.sym_name.symname,
> BFA_SYMNAME_MAXLEN);
> sprintf(fc_host_symbolic_name(host), "%s", symname);
>
>