]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Input: appletouch - fix potential race between resume and open
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 20 Jan 2026 18:14:45 +0000 (10:14 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 21 Jan 2026 22:41:10 +0000 (14:41 -0800)
Take the input device's mutex in atp_resume() and atp_recover() to make
sure they are not racing with open and close methods, and use
input_device_enabled() helper to see if communication with the device
needs to be restarted after resume.

Link: https://patch.msgid.link/uuwucixxc2ckd6ul6yv5mdvkc3twytg4tg5a5vhfqg6m2qcodc@klaco6axglbm
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/appletouch.c

index e669f86f1882e72bf01adbde9b9bfd1afb443ae7..3ce63fb3599210f9989f8b4ff231a0cd5fe45a2b 100644 (file)
@@ -200,7 +200,6 @@ struct atp {
        u8                      *data;          /* transferred data */
        struct input_dev        *input;         /* input dev */
        const struct atp_info   *info;          /* touchpad model */
-       bool                    open;
        bool                    valid;          /* are the samples valid? */
        bool                    size_detect_done;
        bool                    overflow_warned;
@@ -800,7 +799,6 @@ static int atp_open(struct input_dev *input)
        if (usb_submit_urb(dev->urb, GFP_KERNEL))
                return -EIO;
 
-       dev->open = true;
        return 0;
 }
 
@@ -810,7 +808,6 @@ static void atp_close(struct input_dev *input)
 
        usb_kill_urb(dev->urb);
        cancel_work_sync(&dev->work);
-       dev->open = false;
 }
 
 static int atp_handle_geyser(struct atp *dev)
@@ -963,7 +960,8 @@ static int atp_recover(struct atp *dev)
        if (error)
                return error;
 
-       if (dev->open && usb_submit_urb(dev->urb, GFP_KERNEL))
+       guard(mutex)(&dev->input->mutex);
+       if (input_device_enabled(dev->input) && usb_submit_urb(dev->urb, GFP_KERNEL))
                return -EIO;
 
        return 0;
@@ -981,7 +979,8 @@ static int atp_resume(struct usb_interface *iface)
 {
        struct atp *dev = usb_get_intfdata(iface);
 
-       if (dev->open && usb_submit_urb(dev->urb, GFP_KERNEL))
+       guard(mutex)(&dev->input->mutex);
+       if (input_device_enabled(dev->input) && usb_submit_urb(dev->urb, GFP_KERNEL))
                return -EIO;
 
        return 0;