Skip to content

Commit

Permalink
scsi: qla4xxx: Add length check when parsing nlattrs
Browse files Browse the repository at this point in the history
[ Upstream commit 47cd377 ]

There are three places that qla4xxx parses nlattrs:

 - qla4xxx_set_chap_entry()

 - qla4xxx_iface_set_param()

 - qla4xxx_sysfs_ddb_set_param()

and each of them directly converts the nlattr to specific pointer of
structure without length checking. This could be dangerous as those
attributes are not validated and a malformed nlattr (e.g., length 0) could
result in an OOB read that leaks heap dirty data.

Add the nla_len check before accessing the nlattr data and return EINVAL if
the length check fails.

Fixes: 26ffd7b ("[SCSI] qla4xxx: Add support to set CHAP entries")
Fixes: 1e9e2be ("[SCSI] qla4xxx: Add flash node mgmt support")
Fixes: 00c3188 ("[SCSI] qla4xxx: fix data alignment and use nl helpers")
Signed-off-by: Lin Ma <linma@zju.edu.cn>
Link: https://lore.kernel.org/r/20230723080053.3714534-1-linma@zju.edu.cn
Reviewed-by: Chris Leech <cleech@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
f0rm2l1n authored and gregkh committed Sep 13, 2023
1 parent 1806eda commit 25feffb
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions drivers/scsi/qla4xxx/ql4_os.c
Expand Up @@ -968,6 +968,11 @@ static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data, int len)
memset(&chap_rec, 0, sizeof(chap_rec));

nla_for_each_attr(attr, data, len, rem) {
if (nla_len(attr) < sizeof(*param_info)) {
rc = -EINVAL;
goto exit_set_chap;
}

param_info = nla_data(attr);

switch (param_info->param) {
Expand Down Expand Up @@ -2750,6 +2755,11 @@ qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, uint32_t len)
}

nla_for_each_attr(attr, data, len, rem) {
if (nla_len(attr) < sizeof(*iface_param)) {
rval = -EINVAL;
goto exit_init_fw_cb;
}

iface_param = nla_data(attr);

if (iface_param->param_type == ISCSI_NET_PARAM) {
Expand Down Expand Up @@ -8104,6 +8114,11 @@ qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess,

memset((void *)&chap_tbl, 0, sizeof(chap_tbl));
nla_for_each_attr(attr, data, len, rem) {
if (nla_len(attr) < sizeof(*fnode_param)) {
rc = -EINVAL;
goto exit_set_param;
}

fnode_param = nla_data(attr);

switch (fnode_param->param) {
Expand Down

0 comments on commit 25feffb

Please sign in to comment.