Selaa lähdekoodia

staging:iio:adis16260: Add value range check for calibscale/-bias

Instead of just cutting of the upper bits of the value make sure that the value
is in the valid range and return an error if it is not.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Lars-Peter Clausen 12 vuotta sitten
vanhempi
commit
f4f87d0411
1 muutettua tiedostoa jossa 9 lisäystä ja 6 poistoa
  1. 9 6
      drivers/staging/iio/gyro/adis16260_core.c

+ 9 - 6
drivers/staging/iio/gyro/adis16260_core.c

@@ -311,18 +311,21 @@ static int adis16260_write_raw(struct iio_dev *indio_dev,
 			       long mask)
 			       long mask)
 {
 {
 	struct adis *adis = iio_priv(indio_dev);
 	struct adis *adis = iio_priv(indio_dev);
-	int bits = 12;
-	s16 val16;
 	u8 addr;
 	u8 addr;
+
 	switch (mask) {
 	switch (mask) {
 	case IIO_CHAN_INFO_CALIBBIAS:
 	case IIO_CHAN_INFO_CALIBBIAS:
-		val16 = val & ((1 << bits) - 1);
+		if (val < -2048 || val >= 2048)
+			return -EINVAL;
+
 		addr = adis16260_addresses[chan->scan_index][0];
 		addr = adis16260_addresses[chan->scan_index][0];
-		return adis_write_reg_16(adis, addr, val16);
+		return adis_write_reg_16(adis, addr, val);
 	case IIO_CHAN_INFO_CALIBSCALE:
 	case IIO_CHAN_INFO_CALIBSCALE:
-		val16 = val & ((1 << bits) - 1);
+		if (val < 0 || val >= 4096)
+			return -EINVAL;
+
 		addr = adis16260_addresses[chan->scan_index][1];
 		addr = adis16260_addresses[chan->scan_index][1];
-		return adis_write_reg_16(adis, addr, val16);
+		return adis_write_reg_16(adis, addr, val);
 	}
 	}
 	return -EINVAL;
 	return -EINVAL;
 }
 }