mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
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>
This commit is contained in:
parent
587b1eb162
commit
183a1fcfd8
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user