aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDima Zavin <dima@android.com>2011-10-04 17:10:45 -0700
committerDima Zavin <dima@android.com>2011-10-04 22:51:05 -0700
commit183a1fcfd801a204c86edfbf55c2b902cc028007 (patch)
tree8d80a2775d3e0dcb26329629d7577b38f9f0b0c8
parent587b1eb1629612189c8b278d4efee952bcf73b4f (diff)
downloadkernel_samsung_aries-183a1fcfd801a204c86edfbf55c2b902cc028007.zip
kernel_samsung_aries-183a1fcfd801a204c86edfbf55c2b902cc028007.tar.gz
kernel_samsung_aries-183a1fcfd801a204c86edfbf55c2b902cc028007.tar.bz2
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. Change-Id: Icd0f59f8cc98392be4c4d13bd45b5cf94317eb5a Signed-off-by: Dima Zavin <dima@android.com>
-rw-r--r--drivers/input/evdev.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index 10ae1c9..5c5f9db 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -405,14 +405,12 @@ 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;