Input: evdev - properly access RCU-protected 'grab' data
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 2 May 2012 07:13:36 +0000 (00:13 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 2 May 2012 07:23:14 +0000 (00:23 -0700)
We should use rcu_dereference_protected() when checking if given client
is the one that grabbed the device. This fixes warnings produced by
sparse.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/evdev.c

index 4b2e10d5d641a9d90f41afdf43f6fb6ed64c5987..9226b4d9118f5c2d453d0ef643543e57b75dea18 100644 (file)
@@ -180,7 +180,10 @@ static int evdev_grab(struct evdev *evdev, struct evdev_client *client)
 
 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
 {
-       if (evdev->grab != client)
+       struct evdev_client *grab = rcu_dereference_protected(evdev->grab,
+                                       lockdep_is_held(&evdev->mutex));
+
+       if (grab != client)
                return  -EINVAL;
 
        rcu_assign_pointer(evdev->grab, NULL);
@@ -259,8 +262,7 @@ static int evdev_release(struct inode *inode, struct file *file)
        struct evdev *evdev = client->evdev;
 
        mutex_lock(&evdev->mutex);
-       if (evdev->grab == client)
-               evdev_ungrab(evdev, client);
+       evdev_ungrab(evdev, client);
        mutex_unlock(&evdev->mutex);
 
        evdev_detach_client(evdev, client);