]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Input: gpio-keys - fix possible concurrent access in gpio_keys_irq_timer()
authorGatien Chevallier <gatien.chevallier@foss.st.com>
Fri, 30 May 2025 23:09:23 +0000 (16:09 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Jun 2025 10:07:29 +0000 (11:07 +0100)
commit 8f38219fa139623c29db2cb0f17d0a197a86e344 upstream.

gpio_keys_irq_isr() and gpio_keys_irq_timer() access the same resources.
There could be a concurrent access if a GPIO interrupt occurs in parallel
of a HR timer interrupt.

Guard back those resources with a spinlock.

Fixes: 019002f20cb5 ("Input: gpio-keys - use hrtimer for release timer")
Signed-off-by: Gatien Chevallier <gatien.chevallier@foss.st.com>
Link: https://lore.kernel.org/r/20250528-gpio_keys_preempt_rt-v2-2-3fc55a9c3619@foss.st.com
Cc: stable@vger.kernel.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/input/keyboard/gpio_keys.c

index a5dc4ab87fa1f5bb2faf392ac98d636e912c858b..b55306cb354aeae17d050e04fb602c8b6ca896ba 100644 (file)
@@ -455,6 +455,8 @@ static enum hrtimer_restart gpio_keys_irq_timer(struct hrtimer *t)
                                                      release_timer);
        struct input_dev *input = bdata->input;
 
+       guard(spinlock_irqsave)(&bdata->lock);
+
        if (bdata->key_pressed) {
                input_event(input, EV_KEY, *bdata->code, 0);
                input_sync(input);