mirror of https://github.com/torvalds/linux.git
ASoC: SDCA: Add bounds check for function address
SDCA only supports 3-bits for the function address, but the ACPI value is 64-bits. Update the code that parses this to do a bounds check and error out on invalid addresses. Currently, an invalid address would truncate to the bottom 3-bits when used and thus use a likely incorrect address. With the bounds check, it is also now safe to shrink the size of the adr member of sdca_function_desc to a u8 and rearrange the struct members to pack better with the new size of adr. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://patch.msgid.link/20241220173516.907406-3-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
935cd06bfa
commit
c36297b1bd
|
|
@ -23,9 +23,9 @@ struct sdw_slave;
|
|||
* @name: human-readable string
|
||||
*/
|
||||
struct sdca_function_desc {
|
||||
u64 adr;
|
||||
u32 type;
|
||||
const char *name;
|
||||
u32 type;
|
||||
u8 adr;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -108,17 +108,12 @@ static int find_sdca_function(struct acpi_device *adev, void *data)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* The number of functions cannot exceed 8, we could use
|
||||
* acpi_get_local_address() but the value is stored as u64 so
|
||||
* we might as well avoid casts and intermediate levels
|
||||
*/
|
||||
ret = acpi_get_local_u64_address(adev->handle, &addr);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!addr) {
|
||||
dev_err(dev, "no addr\n");
|
||||
if (!addr || addr > 0x7) {
|
||||
dev_err(dev, "invalid addr: 0x%llx\n", addr);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue