diff options
author | Dima Zavin <dima@android.com> | 2011-12-30 23:16:44 (GMT) |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-12-30 23:26:35 (GMT) |
commit | 509f87c5f564627b6b9fc763e74ef3608213d610 (patch) | |
tree | c5034b38b7c49d75726ed24411a4bd9c57bc1f73 | |
parent | e90f869cae3b4aedf0f6d2ca8048d60245ee77f7 (diff) | |
download | linux-509f87c5f564627b6b9fc763e74ef3608213d610.tar.xz |
Input: evdev - do not block waiting for an event if fd is nonblock
If there is a full packet in the buffer, and we overflow that buffer
right after checking for that condition, it would have been possible
for us to block indefinitely (rather, until the next full packet) even if
the file was marked as O_NONBLOCK.
Cc: Jeff Brown <jeffbrown@android.com>
Signed-off-by: Dima Zavin <dima@android.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r-- | drivers/input/evdev.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index a9d8716..76457d5 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c @@ -391,14 +391,13 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, if (count < input_event_size()) return -EINVAL; - if (client->packet_head == client->tail && evdev->exist && - (file->f_flags & O_NONBLOCK)) - return -EAGAIN; - - retval = wait_event_interruptible(evdev->wait, - client->packet_head != client->tail || !evdev->exist); - if (retval) - return retval; + if (!(file->f_flags & O_NONBLOCK)) { + retval = wait_event_interruptible(evdev->wait, + client->packet_head != client->tail || + !evdev->exist); + if (retval) + return retval; + } if (!evdev->exist) return -ENODEV; |