aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorDima Zavin <dima@android.com>2011-12-30 18:16:44 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2011-12-30 18:26:35 -0500
commit509f87c5f564627b6b9fc763e74ef3608213d610 (patch)
treec5034b38b7c49d75726ed24411a4bd9c57bc1f73 /drivers/input
parente90f869cae3b4aedf0f6d2ca8048d60245ee77f7 (diff)
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>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/evdev.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index a9d871651ce7..76457d50bc34 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,
391 if (count < input_event_size()) 391 if (count < input_event_size())
392 return -EINVAL; 392 return -EINVAL;
393 393
394 if (client->packet_head == client->tail && evdev->exist && 394 if (!(file->f_flags & O_NONBLOCK)) {
395 (file->f_flags & O_NONBLOCK)) 395 retval = wait_event_interruptible(evdev->wait,
396 return -EAGAIN; 396 client->packet_head != client->tail ||
397 397 !evdev->exist);
398 retval = wait_event_interruptible(evdev->wait, 398 if (retval)
399 client->packet_head != client->tail || !evdev->exist); 399 return retval;
400 if (retval) 400 }
401 return retval;
402 401
403 if (!evdev->exist) 402 if (!evdev->exist)
404 return -ENODEV; 403 return -ENODEV;