aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/evdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/evdev.c')
-rw-r--r--drivers/input/evdev.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index c8471a2552e7..7f42d3a454d2 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -321,6 +321,9 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,
321 struct input_event event; 321 struct input_event event;
322 int retval; 322 int retval;
323 323
324 if (count < input_event_size())
325 return -EINVAL;
326
324 retval = mutex_lock_interruptible(&evdev->mutex); 327 retval = mutex_lock_interruptible(&evdev->mutex);
325 if (retval) 328 if (retval)
326 return retval; 329 return retval;
@@ -330,17 +333,16 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,
330 goto out; 333 goto out;
331 } 334 }
332 335
333 while (retval < count) { 336 do {
334
335 if (input_event_from_user(buffer + retval, &event)) { 337 if (input_event_from_user(buffer + retval, &event)) {
336 retval = -EFAULT; 338 retval = -EFAULT;
337 goto out; 339 goto out;
338 } 340 }
341 retval += input_event_size();
339 342
340 input_inject_event(&evdev->handle, 343 input_inject_event(&evdev->handle,
341 event.type, event.code, event.value); 344 event.type, event.code, event.value);
342 retval += input_event_size(); 345 } while (retval + input_event_size() <= count);
343 }
344 346
345 out: 347 out:
346 mutex_unlock(&evdev->mutex); 348 mutex_unlock(&evdev->mutex);