Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82f30156 authored by David Frey's avatar David Frey Committed by Jonathan Cameron
Browse files

iio: light: opt3001: fix mutex unlock race



When an end-of-conversion interrupt is received after performing a
single-shot reading of the light sensor, the driver was waking up the
result ready queue before checking opt->ok_to_ignore_lock to determine
if it should unlock the mutex. The problem occurred in the case where
the other thread woke up and changed the value of opt->ok_to_ignore_lock
to false prior to the interrupt thread performing its read of the
variable. In this case, the mutex would be unlocked twice.

Signed-off-by: default avatarDavid Frey <dpfrey@gmail.com>
Reviewed-by: default avatarAndreas Dannenberg <dannenberg@ti.com>
Fixes: 94a9b7b1 ("iio: light: add support for TI's opt3001 light sensor")
Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent c62dd449
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -686,6 +686,7 @@ static irqreturn_t opt3001_irq(int irq, void *_iio)
	struct iio_dev *iio = _iio;
	struct opt3001 *opt = iio_priv(iio);
	int ret;
	bool wake_result_ready_queue = false;

	if (!opt->ok_to_ignore_lock)
		mutex_lock(&opt->lock);
@@ -720,13 +721,16 @@ static irqreturn_t opt3001_irq(int irq, void *_iio)
		}
		opt->result = ret;
		opt->result_ready = true;
		wake_up(&opt->result_ready_queue);
		wake_result_ready_queue = true;
	}

out:
	if (!opt->ok_to_ignore_lock)
		mutex_unlock(&opt->lock);

	if (wake_result_ready_queue)
		wake_up(&opt->result_ready_queue);

	return IRQ_HANDLED;
}