scsi: qla4xxx: Replace all non-returning strlcpy() with strscpy()
authorAzeem Shaikh <azeemshaikh38@gmail.com>
Tue, 16 May 2023 02:53:55 +0000 (02:53 +0000)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 17 May 2023 01:40:41 +0000 (21:40 -0400)
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@gmail.com>
Link: https://lore.kernel.org/r/20230516025355.2835898-1-azeemshaikh38@gmail.com
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla4xxx/ql4_mbx.c
drivers/scsi/qla4xxx/ql4_os.c

index cd71074..249f1d7 100644 (file)
@@ -1611,8 +1611,8 @@ int qla4xxx_get_chap(struct scsi_qla_host *ha, char *username, char *password,
                goto exit_get_chap;
        }
 
-       strlcpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
-       strlcpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
+       strscpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
+       strscpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
        chap_table->cookie = cpu_to_le16(CHAP_VALID_COOKIE);
 
 exit_get_chap:
@@ -1732,8 +1732,8 @@ int qla4xxx_get_uni_chap_at_index(struct scsi_qla_host *ha, char *username,
                goto exit_unlock_uni_chap;
        }
 
-       strlcpy(password, chap_table->secret, MAX_CHAP_SECRET_LEN);
-       strlcpy(username, chap_table->name, MAX_CHAP_NAME_LEN);
+       strscpy(password, chap_table->secret, MAX_CHAP_SECRET_LEN);
+       strscpy(username, chap_table->name, MAX_CHAP_NAME_LEN);
 
        rval = QLA_SUCCESS;
 
index ee6d784..b2a3988 100644 (file)
@@ -798,9 +798,9 @@ static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
                        continue;
 
                chap_rec->chap_tbl_idx = i;
-               strlcpy(chap_rec->username, chap_table->name,
+               strscpy(chap_rec->username, chap_table->name,
                        ISCSI_CHAP_AUTH_NAME_MAX_LEN);
-               strlcpy(chap_rec->password, chap_table->secret,
+               strscpy(chap_rec->password, chap_table->secret,
                        QL4_CHAP_MAX_SECRET_LEN);
                chap_rec->password_length = chap_table->secret_len;
 
@@ -6052,8 +6052,8 @@ static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username,
                if (!(chap_table->flags & BIT_6)) /* Not BIDI */
                        continue;
 
-               strlcpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
-               strlcpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
+               strscpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
+               strscpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
                ret = 0;
                break;
        }
@@ -6281,8 +6281,8 @@ static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry,
 
        tddb->tpgt = sess->tpgt;
        tddb->port = conn->persistent_port;
-       strlcpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE);
-       strlcpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN);
+       strscpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE);
+       strscpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN);
 }
 
 static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry,
@@ -7781,7 +7781,7 @@ static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess,
                goto exit_ddb_logout;
        }
 
-       strlcpy(flash_tddb->iscsi_name, fnode_sess->targetname,
+       strscpy(flash_tddb->iscsi_name, fnode_sess->targetname,
                ISCSI_NAME_SIZE);
 
        if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4))