linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] iio: sca3000: Potential endian bug in sca3000_read_event_value()
@ 2019-06-21  9:18 Dan Carpenter
  2019-06-22  8:43 ` Jonathan Cameron
  0 siblings, 1 reply; 2+ messages in thread
From: Dan Carpenter @ 2019-06-21  9:18 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	Gustavo A. R. Silva, linux-iio, kernel-janitors

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>
---
 drivers/iio/accel/sca3000.c | 7 ++++---
 1 file 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];
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] iio: sca3000: Potential endian bug in sca3000_read_event_value()
  2019-06-21  9:18 [PATCH] iio: sca3000: Potential endian bug in sca3000_read_event_value() Dan Carpenter
@ 2019-06-22  8:43 ` Jonathan Cameron
  0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Cameron @ 2019-06-22  8:43 UTC (permalink / raw)
  To: Dan Carpenter
  Cc: Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	Gustavo A. R. Silva, linux-iio, kernel-janitors

On Fri, 21 Jun 2019 12:18:28 +0300
Dan Carpenter <dan.carpenter@oracle.com> wrote:

> 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>
Hi Dan,

Great catch,  I've applied this to the togreg branch of iio.git (rather
than fixes) given the point in the cycle and limited chance anyone is
actually running this obsolete part on a be64 machine.  I would love
to be proved wrong though and would be happy to push this for stable
if we do get any reports!

Thanks,

Jonathan
> ---
>  drivers/iio/accel/sca3000.c | 7 ++++---
>  1 file 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];
>  


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-06-22  8:43 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-21  9:18 [PATCH] iio: sca3000: Potential endian bug in sca3000_read_event_value() Dan Carpenter
2019-06-22  8:43 ` Jonathan Cameron

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).