* [PATCH] iio: imu: kmx61: Fix TOCTOU race condition
@ 2026-05-12 12:03 Maxwell Doose
2026-05-12 15:17 ` Maxwell Doose
2026-05-12 15:54 ` David Lechner
0 siblings, 2 replies; 8+ messages in thread
From: Maxwell Doose @ 2026-05-12 12:03 UTC (permalink / raw)
To: jic23
Cc: David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta,
open list:IIO SUBSYSTEM AND DRIVERS, open list
A Time-of-check to Time-of-use race condition is present in
kmx61_write_event_config(). Move the mutex_lock() call above it to fix
it.
Fixes: fd3ae7a9f21c ("iio: imu: kmx61: Add support for any motion trigger")
Signed-off-by: Maxwell Doose <m32285159@gmail.com>
---
drivers/iio/imu/kmx61.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/imu/kmx61.c b/drivers/iio/imu/kmx61.c
index 3cd91d8a89ee..9aa00acc7f14 100644
--- a/drivers/iio/imu/kmx61.c
+++ b/drivers/iio/imu/kmx61.c
@@ -942,11 +942,13 @@ static int kmx61_write_event_config(struct iio_dev *indio_dev,
struct kmx61_data *data = kmx61_get_data(indio_dev);
int ret = 0;
- if (state && data->ev_enable_state)
- return 0;
-
mutex_lock(&data->lock);
+ if (state && data->ev_enable_state) {
+ ret = 0;
+ goto err_unlock;
+ }
+
if (!state && data->motion_trig_on) {
data->ev_enable_state = false;
goto err_unlock;
--
2.54.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 12:03 [PATCH] iio: imu: kmx61: Fix TOCTOU race condition Maxwell Doose @ 2026-05-12 15:17 ` Maxwell Doose 2026-05-12 15:24 ` Andy Shevchenko 2026-05-12 15:54 ` David Lechner 1 sibling, 1 reply; 8+ messages in thread From: Maxwell Doose @ 2026-05-12 15:17 UTC (permalink / raw) To: Maxwell Doose, jic23 Cc: David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On Tue May 12, 2026 at 7:03 AM CDT, Maxwell Doose wrote: > A Time-of-check to Time-of-use race condition is present in > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > it. > > Fixes: fd3ae7a9f21c ("iio: imu: kmx61: Add support for any motion trigger") > Signed-off-by: Maxwell Doose <m32285159@gmail.com> > --- > drivers/iio/imu/kmx61.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/imu/kmx61.c b/drivers/iio/imu/kmx61.c > index 3cd91d8a89ee..9aa00acc7f14 100644 > --- a/drivers/iio/imu/kmx61.c > +++ b/drivers/iio/imu/kmx61.c > @@ -942,11 +942,13 @@ static int kmx61_write_event_config(struct iio_dev *indio_dev, > struct kmx61_data *data = kmx61_get_data(indio_dev); > int ret = 0; > > - if (state && data->ev_enable_state) > - return 0; > - > mutex_lock(&data->lock); > > + if (state && data->ev_enable_state) { > + ret = 0; > + goto err_unlock; > + } > + > if (!state && data->motion_trig_on) { > data->ev_enable_state = false; > goto err_unlock; Whoops, forgot to add reported-by and closes tags, so: Reported-by: sashiko <sashiko-bot@kernel.org> Closes: https://sashiko.dev/#/patchset/20260507223337.48437-1-m32285159%40gmail.com best regards, max ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 15:17 ` Maxwell Doose @ 2026-05-12 15:24 ` Andy Shevchenko 2026-05-12 15:30 ` Maxwell Doose 0 siblings, 1 reply; 8+ messages in thread From: Andy Shevchenko @ 2026-05-12 15:24 UTC (permalink / raw) To: Maxwell Doose Cc: jic23, David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On Tue, May 12, 2026 at 6:17 PM Maxwell Doose <m32285159@gmail.com> wrote: > > On Tue May 12, 2026 at 7:03 AM CDT, Maxwell Doose wrote: > > A Time-of-check to Time-of-use race condition is present in > > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > > it. I think you want to elaborate a bit more on this. Id est explain why ev_enable_state needs to be protected. Not everybody is willing to go to some site to read some AI reports and interpreted them. > Reported-by: sashiko <sashiko-bot@kernel.org> > Closes: https://sashiko.dev/#/patchset/20260507223337.48437-1-m32285159%40gmail.com -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 15:24 ` Andy Shevchenko @ 2026-05-12 15:30 ` Maxwell Doose 2026-05-12 17:10 ` Jonathan Cameron 0 siblings, 1 reply; 8+ messages in thread From: Maxwell Doose @ 2026-05-12 15:30 UTC (permalink / raw) To: Andy Shevchenko Cc: jic23, David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On Tue, May 12, 2026 at 10:25 AM Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > > On Tue, May 12, 2026 at 6:17 PM Maxwell Doose <m32285159@gmail.com> wrote: > > > > On Tue May 12, 2026 at 7:03 AM CDT, Maxwell Doose wrote: > > > A Time-of-check to Time-of-use race condition is present in > > > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > > > it. > > I think you want to elaborate a bit more on this. Id est explain why > ev_enable_state needs to be protected. Not everybody is willing to go > to some site to read some AI reports and interpreted them. > Can do that for v2. I believe that it needs to be protected since later we set ev_enable_state to false (basically right after). Could be wrong of course, but Jonathan did confirm the TOCTOU. best regards, max > > > Reported-by: sashiko <sashiko-bot@kernel.org> > > Closes: https://sashiko.dev/#/patchset/20260507223337.48437-1-m32285159%40gmail.com > > > -- > With Best Regards, > Andy Shevchenko ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 15:30 ` Maxwell Doose @ 2026-05-12 17:10 ` Jonathan Cameron 2026-05-12 17:37 ` Maxwell Doose 0 siblings, 1 reply; 8+ messages in thread From: Jonathan Cameron @ 2026-05-12 17:10 UTC (permalink / raw) To: Maxwell Doose Cc: Andy Shevchenko, David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On Tue, 12 May 2026 10:30:42 -0500 Maxwell Doose <m32285159@gmail.com> wrote: > On Tue, May 12, 2026 at 10:25 AM Andy Shevchenko > <andy.shevchenko@gmail.com> wrote: > > > > On Tue, May 12, 2026 at 6:17 PM Maxwell Doose <m32285159@gmail.com> wrote: > > > > > > On Tue May 12, 2026 at 7:03 AM CDT, Maxwell Doose wrote: > > > > A Time-of-check to Time-of-use race condition is present in > > > > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > > > > it. > > > > I think you want to elaborate a bit more on this. Id est explain why > > ev_enable_state needs to be protected. Not everybody is willing to go > > to some site to read some AI reports and interpreted them. > > > > Can do that for v2. I believe that it needs to be protected since > later we set ev_enable_state to false (basically right after). Could > be wrong of course, but Jonathan did confirm the TOCTOU. I'd talk more about how we'd get a race. If two calls enter the function at the same time (which is easy to do) they may both pass this check before getting to the lock. Therefore we end up with at best pointless repeated work, at worst a reference or similar count issue. You'd need to look closely at what is protected to be sure whether it benign waste of time or a real bug. Jonathan > > best regards, > max > > > > > > > > Reported-by: sashiko <sashiko-bot@kernel.org> > > > Closes: https://sashiko.dev/#/patchset/20260507223337.48437-1-m32285159%40gmail.com > > > > > > -- > > With Best Regards, > > Andy Shevchenko ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 17:10 ` Jonathan Cameron @ 2026-05-12 17:37 ` Maxwell Doose 2026-05-13 13:11 ` Jonathan Cameron 0 siblings, 1 reply; 8+ messages in thread From: Maxwell Doose @ 2026-05-12 17:37 UTC (permalink / raw) To: Jonathan Cameron Cc: Andy Shevchenko, David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On Tue, May 12, 2026 at 12:10 PM Jonathan Cameron <jic23@kernel.org> wrote: > > On Tue, 12 May 2026 10:30:42 -0500 > Maxwell Doose <m32285159@gmail.com> wrote: > > > On Tue, May 12, 2026 at 10:25 AM Andy Shevchenko > > <andy.shevchenko@gmail.com> wrote: > > > > > > On Tue, May 12, 2026 at 6:17 PM Maxwell Doose <m32285159@gmail.com> wrote: > > > > > > > > On Tue May 12, 2026 at 7:03 AM CDT, Maxwell Doose wrote: > > > > > A Time-of-check to Time-of-use race condition is present in > > > > > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > > > > > it. > > > > > > I think you want to elaborate a bit more on this. Id est explain why > > > ev_enable_state needs to be protected. Not everybody is willing to go > > > to some site to read some AI reports and interpreted them. > > > > > > > Can do that for v2. I believe that it needs to be protected since > > later we set ev_enable_state to false (basically right after). Could > > be wrong of course, but Jonathan did confirm the TOCTOU. > > I'd talk more about how we'd get a race. If two calls enter the function > at the same time (which is easy to do) they may both pass this check before > getting to the lock. Therefore we end up with at best pointless repeated > work, at worst a reference or similar count issue. You'd need to look closely > at what is protected to be sure whether it benign waste of time or a real > bug. > Well, since we're accessing the shared state via kmx61_get_data (by the way of iio_priv), we could check that value, pass the check, and then have the value change before we acquire the lock. TOCTOU race, no? If data->ev_enable_state is false then becomes true after we check the value but before we get the lock, then ev_enable_state changes to whatever the input variable state is. Anyways, just saying that this is certainly a bug. Would coming across it be common? Probably not, likely one of the much rarer ones, but still worth fixing. best regards, max > Jonathan > > > > > best regards, > > max > > > > > > > > > > > > > Reported-by: sashiko <sashiko-bot@kernel.org> > > > > Closes: https://sashiko.dev/#/patchset/20260507223337.48437-1-m32285159%40gmail.com > > > > > > > > > -- > > > With Best Regards, > > > Andy Shevchenko > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 17:37 ` Maxwell Doose @ 2026-05-13 13:11 ` Jonathan Cameron 0 siblings, 0 replies; 8+ messages in thread From: Jonathan Cameron @ 2026-05-13 13:11 UTC (permalink / raw) To: Maxwell Doose Cc: Andy Shevchenko, David Lechner, Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On Tue, 12 May 2026 12:37:56 -0500 Maxwell Doose <m32285159@gmail.com> wrote: > On Tue, May 12, 2026 at 12:10 PM Jonathan Cameron <jic23@kernel.org> wrote: > > > > On Tue, 12 May 2026 10:30:42 -0500 > > Maxwell Doose <m32285159@gmail.com> wrote: > > > > > On Tue, May 12, 2026 at 10:25 AM Andy Shevchenko > > > <andy.shevchenko@gmail.com> wrote: > > > > > > > > On Tue, May 12, 2026 at 6:17 PM Maxwell Doose <m32285159@gmail.com> wrote: > > > > > > > > > > On Tue May 12, 2026 at 7:03 AM CDT, Maxwell Doose wrote: > > > > > > A Time-of-check to Time-of-use race condition is present in > > > > > > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > > > > > > it. > > > > > > > > I think you want to elaborate a bit more on this. Id est explain why > > > > ev_enable_state needs to be protected. Not everybody is willing to go > > > > to some site to read some AI reports and interpreted them. > > > > > > > > > > Can do that for v2. I believe that it needs to be protected since > > > later we set ev_enable_state to false (basically right after). Could > > > be wrong of course, but Jonathan did confirm the TOCTOU. > > > > I'd talk more about how we'd get a race. If two calls enter the function > > at the same time (which is easy to do) they may both pass this check before > > getting to the lock. Therefore we end up with at best pointless repeated > > work, at worst a reference or similar count issue. You'd need to look closely > > at what is protected to be sure whether it benign waste of time or a real > > bug. > > > > Well, since we're accessing the shared state via kmx61_get_data (by > the way of iio_priv), we could check that value, pass the check, and > then have the value change before we acquire the lock. TOCTOU race, > no? If data->ev_enable_state is false then becomes true after we check > the value but before we get the lock, then ev_enable_state changes to > whatever the input variable state is. Anyways, just saying that this > is certainly a bug. Would coming across it be common? Probably not, > likely one of the much rarer ones, but still worth fixing. It's not a bug if for instance two racing value sets result in any random one of them being written. That happens even with the locking. It is only a bug if letting both of them write results in something overflowing. Some writes in cases like this are idempotent - e.g. turning something on that is already on has no affect. My guess would be that the power state transition could happen twice in the enable direction resulting in +2 rather than +1 resulting in a reference counter that may never go back to 0. Let's look at the code and the various state combinations. Ignore motion_trig_on for now. state == true and data->enable_state == false static int kmx61_write_event_config(struct iio_dev *indio_dev, const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, bool state) { struct kmx61_data *data = kmx61_get_data(indio_dev); int ret = 0; if (state && data->ev_enable_state) // Both threads pass this check return 0; // Threads serialized in next section mutex_lock(&data->lock); //ignore for simplicity - though I'm far from convinced this //is right either for the state == false path when //motion_trig_on == true - I think the runtime pm counters // will not be decremented whereas they were incremented // on the state == true, motion_trig_on = true path. // if (!state && data->motion_trig_on) { // data->ev_enable_state = false; // goto err_unlock; // } //Next bit runs twice and in there we pm_runtime_resume_and_get() //which will run twice for the same thing being enabled - hence the +2 //reference count mentioned above. ret = kmx61_set_power_state(data, state, KMX61_ACC); if (ret < 0) goto err_unlock; ret = kmx61_setup_any_motion_interrupt(data, state); if (ret < 0) { kmx61_set_power_state(data, false, KMX61_ACC); goto err_unlock; } data->ev_enable_state = state; err_unlock: mutex_unlock(&data->lock); return ret; } Anyhow, looks like a nest of race conditions. If you don't mind could you take a look more generally at the state machines in here and see if we have more bugs to close? That will also help you describe why this particular fix is right. Jonathan > > best regards, > max > > > > > > Jonathan > > > > > > > > best regards, > > > max > > > > > > > > > > > > > > > > > > Reported-by: sashiko <sashiko-bot@kernel.org> > > > > > Closes: https://sashiko.dev/#/patchset/20260507223337.48437-1-m32285159%40gmail.com > > > > > > > > > > > > -- > > > > With Best Regards, > > > > Andy Shevchenko > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] iio: imu: kmx61: Fix TOCTOU race condition 2026-05-12 12:03 [PATCH] iio: imu: kmx61: Fix TOCTOU race condition Maxwell Doose 2026-05-12 15:17 ` Maxwell Doose @ 2026-05-12 15:54 ` David Lechner 1 sibling, 0 replies; 8+ messages in thread From: David Lechner @ 2026-05-12 15:54 UTC (permalink / raw) To: Maxwell Doose, jic23 Cc: Nuno Sá, Andy Shevchenko, Daniel Baluta, open list:IIO SUBSYSTEM AND DRIVERS, open list On 5/12/26 7:03 AM, Maxwell Doose wrote: > A Time-of-check to Time-of-use race condition is present in > kmx61_write_event_config(). Move the mutex_lock() call above it to fix > it. > > Fixes: fd3ae7a9f21c ("iio: imu: kmx61: Add support for any motion trigger") > Signed-off-by: Maxwell Doose <m32285159@gmail.com> > --- > drivers/iio/imu/kmx61.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/iio/imu/kmx61.c b/drivers/iio/imu/kmx61.c > index 3cd91d8a89ee..9aa00acc7f14 100644 > --- a/drivers/iio/imu/kmx61.c > +++ b/drivers/iio/imu/kmx61.c > @@ -942,11 +942,13 @@ static int kmx61_write_event_config(struct iio_dev *indio_dev, > struct kmx61_data *data = kmx61_get_data(indio_dev); > int ret = 0; > > - if (state && data->ev_enable_state) > - return 0; > - > mutex_lock(&data->lock); > > + if (state && data->ev_enable_state) { > + ret = 0; > + goto err_unlock; > + } > + > if (!state && data->motion_trig_on) { > data->ev_enable_state = false; > goto err_unlock; There are actually 3 other drivers that have identical code which likely need the same fix. And in all of these, there is an write_event() callback that reads ev_enable_state without holding the mutex that looks suspicious too. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-05-13 13:11 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-12 12:03 [PATCH] iio: imu: kmx61: Fix TOCTOU race condition Maxwell Doose 2026-05-12 15:17 ` Maxwell Doose 2026-05-12 15:24 ` Andy Shevchenko 2026-05-12 15:30 ` Maxwell Doose 2026-05-12 17:10 ` Jonathan Cameron 2026-05-12 17:37 ` Maxwell Doose 2026-05-13 13:11 ` Jonathan Cameron 2026-05-12 15:54 ` David Lechner
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox