mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 00:34:20 +08:00
Input: uinput - support injecting multiple events in one write() call
Rework the code in uinput_inject_event so that it matches the code in evdev_write and allows injecting more than one event, or zero events. Signed-off-by: Ryan Mallon <rmallon@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
8474caddcc
commit
cbf0541374
@ -430,20 +430,30 @@ static int uinput_setup_device(struct uinput_device *udev,
|
||||
return retval;
|
||||
}
|
||||
|
||||
static ssize_t uinput_inject_event(struct uinput_device *udev,
|
||||
const char __user *buffer, size_t count)
|
||||
static ssize_t uinput_inject_events(struct uinput_device *udev,
|
||||
const char __user *buffer, size_t count)
|
||||
{
|
||||
struct input_event ev;
|
||||
size_t bytes = 0;
|
||||
|
||||
if (count < input_event_size())
|
||||
if (count != 0 && count < input_event_size())
|
||||
return -EINVAL;
|
||||
|
||||
if (input_event_from_user(buffer, &ev))
|
||||
return -EFAULT;
|
||||
while (bytes + input_event_size() <= count) {
|
||||
/*
|
||||
* Note that even if some events were fetched successfully
|
||||
* we are still going to return EFAULT instead of partial
|
||||
* count to let userspace know that it got it's buffers
|
||||
* all wrong.
|
||||
*/
|
||||
if (input_event_from_user(buffer + bytes, &ev))
|
||||
return -EFAULT;
|
||||
|
||||
input_event(udev->dev, ev.type, ev.code, ev.value);
|
||||
input_event(udev->dev, ev.type, ev.code, ev.value);
|
||||
bytes += input_event_size();
|
||||
}
|
||||
|
||||
return input_event_size();
|
||||
return bytes;
|
||||
}
|
||||
|
||||
static ssize_t uinput_write(struct file *file, const char __user *buffer,
|
||||
@ -460,7 +470,7 @@ static ssize_t uinput_write(struct file *file, const char __user *buffer,
|
||||
return retval;
|
||||
|
||||
retval = udev->state == UIST_CREATED ?
|
||||
uinput_inject_event(udev, buffer, count) :
|
||||
uinput_inject_events(udev, buffer, count) :
|
||||
uinput_setup_device(udev, buffer, count);
|
||||
|
||||
mutex_unlock(&udev->mutex);
|
||||
|
Loading…
Reference in New Issue
Block a user