* [PATCH v2 1/2] iio: proximity: sx9310: reject out-of-range hardware gain values
2026-11-09 16:51 [PATCH v2 0/2] iio: proximity: sx9310/sx9360: reject out-of-range hardware gain values Arnav Kapoor
@ 2026-11-09 16:51 ` Arnav Kapoor
2026-11-09 16:51 ` [PATCH v2 2/2] iio: proximity: sx9360: " Arnav Kapoor
2026-11-09 18:49 ` [PATCH v2 0/2] iio: proximity: sx9310/sx9360: " Andy Shevchenko
2 siblings, 0 replies; 4+ messages in thread
From: Arnav Kapoor @ 2026-11-09 16:51 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Andy Shevchenko, Gwendal Grignou, Stephen Boyd,
linux-iio, linux-kernel, Arnav Kapoor
sx9310_write_gain() passes the value from userspace to ilog2() and then
FIELD_PREP() into a 2-bit gain field without checking it, so some
values silently program a gain unrelated to the one requested, and the
write still reports success:
- 16 and larger wrap around in the 2-bit field, e.g. 16 sets a gain
of 1 and 32 a gain of 2;
- 0 and negative values set the maximum gain of 8, because ilog2(0)
is -1 and a negative int becomes a large unsigned value.
Return -EINVAL for values <= 0 and for values whose ilog2() does not
fit in the gain field. Values between the supported gains of 1, 2, 4
and 8 are still rounded down, as before, and the gain read back
reflects what was applied.
Fixes: 227c83faa2f8 ("iio: sx9310: Support hardware gain factor")
Signed-off-by: Arnav Kapoor <kapoorarnav43@gmail.com>
---
drivers/iio/proximity/sx9310.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 2585b9c6fb69..9177d6d4a0a1 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -665,16 +665,23 @@ static int sx9310_write_gain(struct sx_common_data *data,
{
unsigned int gain, mask;
+ if (val <= 0)
+ return -EINVAL;
+
gain = ilog2(val);
switch (chan->channel) {
case 0:
case 3:
+ if (!FIELD_FIT(SX9310_REG_PROX_CTRL3_GAIN0_MASK, gain))
+ return -EINVAL;
mask = SX9310_REG_PROX_CTRL3_GAIN0_MASK;
gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN0_MASK, gain);
break;
case 1:
case 2:
+ if (!FIELD_FIT(SX9310_REG_PROX_CTRL3_GAIN12_MASK, gain))
+ return -EINVAL;
mask = SX9310_REG_PROX_CTRL3_GAIN12_MASK;
gain = FIELD_PREP(SX9310_REG_PROX_CTRL3_GAIN12_MASK, gain);
break;
--
2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v2 2/2] iio: proximity: sx9360: reject out-of-range hardware gain values
2026-11-09 16:51 [PATCH v2 0/2] iio: proximity: sx9310/sx9360: reject out-of-range hardware gain values Arnav Kapoor
2026-11-09 16:51 ` [PATCH v2 1/2] iio: proximity: sx9310: " Arnav Kapoor
@ 2026-11-09 16:51 ` Arnav Kapoor
2026-11-09 18:49 ` [PATCH v2 0/2] iio: proximity: sx9310/sx9360: " Andy Shevchenko
2 siblings, 0 replies; 4+ messages in thread
From: Arnav Kapoor @ 2026-11-09 16:51 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Andy Shevchenko, Gwendal Grignou, Stephen Boyd,
linux-iio, linux-kernel, Arnav Kapoor
sx9360_write_gain() passes the value from userspace to ilog2() and then
FIELD_PREP() into the 3-bit PROX_CTRL0 gain field without checking it,
so some values silently program a gain unrelated to the one requested,
and the write still reports success:
- 16 to 255 write gain codes 4 to 7, which the driver does not
advertise, and the next read reports gains of 16 to 128;
- 256 and larger wrap around in the field, e.g. 256 sets a gain of 1;
- 0 and negative values write code 7 (read back as 128), because
ilog2(0) is -1 and a negative int becomes a large unsigned value.
Return -EINVAL for values <= 0 and for values above the gain of 8 code.
FIELD_FIT() is not enough here, as the field also holds codes 4 to 7,
which the driver doesn't support. Values between the supported gains
of 1, 2, 4 and 8 are still rounded down, as before.
Fixes: 1cdb4c47f7f5 ("iio:proximity:sx9360: Add sx9360 support")
Signed-off-by: Arnav Kapoor <kapoorarnav43@gmail.com>
---
drivers/iio/proximity/sx9360.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/iio/proximity/sx9360.c b/drivers/iio/proximity/sx9360.c
index 2a9b37df8f62..ede20dfcdd80 100644
--- a/drivers/iio/proximity/sx9360.c
+++ b/drivers/iio/proximity/sx9360.c
@@ -68,6 +68,7 @@
#define SX9360_REG_PROX_CTRL0_PHM 0x41
#define SX9360_REG_PROX_CTRL0_GAIN_MASK GENMASK(5, 3)
#define SX9360_REG_PROX_CTRL0_GAIN_1 0x80
+#define SX9360_REG_PROX_CTRL0_GAIN_8 0x3
#define SX9360_REG_PROX_CTRL0_RAWFILT_MASK GENMASK(2, 0)
#define SX9360_REG_PROX_CTRL0_RAWFILT_1P50 0x01
#define SX9360_REG_PROX_CTRL1 0x42
@@ -625,7 +626,13 @@ static int sx9360_write_gain(struct sx_common_data *data,
{
unsigned int gain, reg;
+ if (val <= 0)
+ return -EINVAL;
+
gain = ilog2(val);
+ if (gain > SX9360_REG_PROX_CTRL0_GAIN_8)
+ return -EINVAL;
+
reg = SX9360_REG_PROX_CTRL0_PHR + chan->channel;
gain = FIELD_PREP(SX9360_REG_PROX_CTRL0_GAIN_MASK, gain);
--
2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH v2 0/2] iio: proximity: sx9310/sx9360: reject out-of-range hardware gain values
2026-11-09 16:51 [PATCH v2 0/2] iio: proximity: sx9310/sx9360: reject out-of-range hardware gain values Arnav Kapoor
2026-11-09 16:51 ` [PATCH v2 1/2] iio: proximity: sx9310: " Arnav Kapoor
2026-11-09 16:51 ` [PATCH v2 2/2] iio: proximity: sx9360: " Arnav Kapoor
@ 2026-11-09 18:49 ` Andy Shevchenko
2 siblings, 0 replies; 4+ messages in thread
From: Andy Shevchenko @ 2026-11-09 18:49 UTC (permalink / raw)
To: Arnav Kapoor
Cc: Jonathan Cameron, David Lechner, Nuno Sá,
Andy Shevchenko, Gwendal Grignou, Stephen Boyd, linux-iio,
linux-kernel
On Mon, Nov 09, 2026 at 10:21:51PM +0530, Arnav Kapoor wrote:
> sx9310_write_gain() and sx9360_write_gain() squeeze ilog2() of any
> integer into the register field. Values that don't fit wrap around,
> and 0 and negative values turn into the maximum code, while the write
> reports success. Reject those. One patch per driver, as the Fixes tags
> differ.
I would change the error code to -ERANGE which is clearly states that the range
for numbers is wrong (like mathematically). -EINVAL is way too far overloaded
with semantics.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 4+ messages in thread