iio: sca3000: Potential endian bug in sca3000_read_event_value()
authorDan Carpenter <dan.carpenter@oracle.com>
Fri, 21 Jun 2019 09:18:28 +0000 (12:18 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 22 Jun 2019 08:40:36 +0000 (09:40 +0100)
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>
drivers/iio/accel/sca3000.c

index 4964561..9e9f434 100644 (file)
@@ -872,8 +872,9 @@ static int sca3000_read_event_value(struct iio_dev *indio_dev,
                                    enum iio_event_info info,
                                    int *val, int *val2)
 {
                                    enum iio_event_info info,
                                    int *val, int *val2)
 {
-       int ret, i;
        struct sca3000_state *st = iio_priv(indio_dev);
        struct sca3000_state *st = iio_priv(indio_dev);
+       long ret;
+       int i;
 
        switch (info) {
        case IIO_EV_INFO_VALUE:
 
        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)
                        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
                                         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];
 
                                         ARRAY_SIZE(st->info->mot_det_mult_xz))
                                *val += st->info->mot_det_mult_xz[i];