diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2019-06-21 12:18:28 +0300 |
---|---|---|
committer | Jonathan Cameron <Jonathan.Cameron@huawei.com> | 2019-06-22 09:40:36 +0100 |
commit | aabcbfe8dbbfa87f353071182d9bbc68d10f728e (patch) | |
tree | 74d63cb8880443d56f29bb70396b0257d357d0cb /drivers | |
parent | 05b8bcc96278c9ef927a6f25a98e233e55de42e1 (diff) | |
download | linux-aabcbfe8dbbfa87f353071182d9bbc68d10f728e.tar.gz linux-aabcbfe8dbbfa87f353071182d9bbc68d10f728e.tar.bz2 linux-aabcbfe8dbbfa87f353071182d9bbc68d10f728e.zip |
iio: sca3000: Potential endian bug in sca3000_read_event_value()
The problem is that "ret" is an int but we're casting it as
"(unsigned long *)&ret" when we do the for_each_set_bit() loop. This
will not work on big endian 64 bit systems.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/iio/accel/sca3000.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/iio/accel/sca3000.c b/drivers/iio/accel/sca3000.c index 4964561595f5..9e9f4347a325 100644 --- a/drivers/iio/accel/sca3000.c +++ b/drivers/iio/accel/sca3000.c @@ -872,8 +872,9 @@ static int sca3000_read_event_value(struct iio_dev *indio_dev, enum iio_event_info info, int *val, int *val2) { - int ret, i; struct sca3000_state *st = iio_priv(indio_dev); + long ret; + int i; switch (info) { case IIO_EV_INFO_VALUE: @@ -885,11 +886,11 @@ static int sca3000_read_event_value(struct iio_dev *indio_dev, return ret; *val = 0; if (chan->channel2 == IIO_MOD_Y) - for_each_set_bit(i, (unsigned long *)&ret, + for_each_set_bit(i, &ret, ARRAY_SIZE(st->info->mot_det_mult_y)) *val += st->info->mot_det_mult_y[i]; else - for_each_set_bit(i, (unsigned long *)&ret, + for_each_set_bit(i, &ret, ARRAY_SIZE(st->info->mot_det_mult_xz)) *val += st->info->mot_det_mult_xz[i]; |