drivers/iio/proximity/aw96103.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Use get_unaligned_le32() instead of casting to int * to make sure that
reading a 32-bit int value from the firmware binary works correctly on
big-endian architectures.
Fixes: 07b241262dca ("iio: proximity: aw96103: Add support for aw96103/aw96105 proximity sensor")
Signed-off-by: David Lechner <dlechner@baylibre.com>
---
drivers/iio/proximity/aw96103.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/iio/proximity/aw96103.c b/drivers/iio/proximity/aw96103.c
index 3472a2c36e44..8263411c06df 100644
--- a/drivers/iio/proximity/aw96103.c
+++ b/drivers/iio/proximity/aw96103.c
@@ -233,7 +233,7 @@ static void aw96103_parsing_bin_file(struct aw_bin *bin)
{
bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET;
bin->valid_data_len =
- *(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
+ get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) -
AW96103_BIN_DATA_REG_NUM_SIZE;
memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET,
AW96103_BIN_CHIP_TYPE_SIZE);
---
base-commit: ff0843ceb1fb11a6b73e0e77b932ef7967aecd4b
change-id: 20260314-iio-proximity-aw96103-fix-firmware-read-c9378ce60830
Best regards,
--
David Lechner <dlechner@baylibre.com>
On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote: > Use get_unaligned_le32() instead of casting to int * to make sure that > reading a 32-bit int value from the firmware binary works correctly on > big-endian architectures. ... > bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET; > bin->valid_data_len = > - *(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) - > + get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) - > AW96103_BIN_DATA_REG_NUM_SIZE; > memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET, > AW96103_BIN_CHIP_TYPE_SIZE); I gave you a tag, but I have a question here: Hmm... memcpy() happens to work probably due to keeping LE as LE and chip_type being a byte stream itself, if AW96103_BIN_CHIP_TYPE_SIZE is bigger than a byte. Otherwise it may suffer from the same issue, no? -- With Best Regards, Andy Shevchenko
On 3/16/26 5:22 AM, Andy Shevchenko wrote: > On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote: >> Use get_unaligned_le32() instead of casting to int * to make sure that >> reading a 32-bit int value from the firmware binary works correctly on >> big-endian architectures. > > ... > >> bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET; >> bin->valid_data_len = >> - *(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) - >> + get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) - >> AW96103_BIN_DATA_REG_NUM_SIZE; >> memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET, >> AW96103_BIN_CHIP_TYPE_SIZE); > > I gave you a tag, but I have a question here: > Hmm... memcpy() happens to work probably due to keeping LE as LE and chip_type > being a byte stream itself, if AW96103_BIN_CHIP_TYPE_SIZE is bigger than a > byte. Otherwise it may suffer from the same issue, no? > I checked how bin->chip_type is used and it is a string, so not affected.
On Mon, 16 Mar 2026 09:36:33 -0500 David Lechner <dlechner@baylibre.com> wrote: > On 3/16/26 5:22 AM, Andy Shevchenko wrote: > > On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote: > >> Use get_unaligned_le32() instead of casting to int * to make sure that > >> reading a 32-bit int value from the firmware binary works correctly on > >> big-endian architectures. > > > > ... > > > >> bin->valid_data_addr = AW96103_BIN_VALID_DATA_OFFSET; > >> bin->valid_data_len = > >> - *(unsigned int *)(bin->data + AW96103_BIN_DATA_LEN_OFFSET) - > >> + get_unaligned_le32(bin->data + AW96103_BIN_DATA_LEN_OFFSET) - > >> AW96103_BIN_DATA_REG_NUM_SIZE; > >> memcpy(bin->chip_type, bin->data + AW96103_BIN_CHIP_TYPE_OFFSET, > >> AW96103_BIN_CHIP_TYPE_SIZE); > > > > I gave you a tag, but I have a question here: > > Hmm... memcpy() happens to work probably due to keeping LE as LE and chip_type > > being a byte stream itself, if AW96103_BIN_CHIP_TYPE_SIZE is bigger than a > > byte. Otherwise it may suffer from the same issue, no? > > > > I checked how bin->chip_type is used and it is a string, so not affected. I'll give this one a bit longer so Shuaijie can hopefully take a look.
On Sat, Mar 14, 2026 at 06:20:12PM -0500, David Lechner wrote: > Use get_unaligned_le32() instead of casting to int * to make sure that > reading a 32-bit int value from the firmware binary works correctly on > big-endian architectures. Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com> -- With Best Regards, Andy Shevchenko
© 2016 - 2026 Red Hat, Inc.