Message ID | 20250411003209.44053-4-shannon.nelson@amd.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | pds_core: updates and fixes | expand |
On Thu, Apr 10, 2025 at 05:32:07PM -0700, Shannon Nelson wrote: > From: Brett Creeley <brett.creeley@amd.com> > > If the FW doesn't support the PDS_CORE_CMD_FW_CONTROL command > the driver might at the least print garbage and at the worst > crash when the user runs the "devlink dev info" devlink command. > > This happens because the stack variable fw_list is not 0 > initialized which results in fw_list.num_fw_slots being a > garbage value from the stack. Then the driver tries to access > fw_list.fw_names[i] with i >= ARRAY_SIZE and runs off the end > of the array. > > Fix this by initializing the fw_list and by not failing > completely if the devcmd fails because other useful information > is printed via devlink dev info even if the devcmd fails. > > Fixes: 45d76f492938 ("pds_core: set up device and adminq") > Signed-off-by: Brett Creeley <brett.creeley@amd.com> > Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Simon Horman <horms@kernel.org>
diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c b/drivers/net/ethernet/amd/pds_core/devlink.c index c5c787df61a4..d8dc39da4161 100644 --- a/drivers/net/ethernet/amd/pds_core/devlink.c +++ b/drivers/net/ethernet/amd/pds_core/devlink.c @@ -105,7 +105,7 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req, .fw_control.opcode = PDS_CORE_CMD_FW_CONTROL, .fw_control.oper = PDS_CORE_FW_GET_LIST, }; - struct pds_core_fw_list_info fw_list; + struct pds_core_fw_list_info fw_list = {}; struct pdsc *pdsc = devlink_priv(dl); union pds_core_dev_comp comp; char buf[32]; @@ -118,8 +118,6 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req, if (!err) memcpy_fromio(&fw_list, pdsc->cmd_regs->data, sizeof(fw_list)); mutex_unlock(&pdsc->devcmd_lock); - if (err && err != -EIO) - return err; listlen = min(fw_list.num_fw_slots, ARRAY_SIZE(fw_list.fw_names)); for (i = 0; i < listlen; i++) {