Messages in this thread | | | Date | Tue, 10 Sep 2013 17:14:28 -0700 | From | Dmitry Torokhov <> | Subject | Re: [PATCH 1/2] uinput: Support injecting multiple events in one write() call |
| |
Hi Ryan,
On Wed, Sep 11, 2013 at 09:32:52AM +1000, Ryan Mallon wrote: > 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> > --- > drivers/input/misc/uinput.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c > index a0a4bba..6aea346 100644 > --- a/drivers/input/misc/uinput.c > +++ b/drivers/input/misc/uinput.c > @@ -434,16 +434,20 @@ static ssize_t uinput_inject_event(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) { > + if (input_event_from_user(buffer + bytes, &ev)) > + return -EFAULT;
Unless the failure is in the very first packet we should tell the user how many bytes we have transferred successfully instead of returning -EFAULT.
Thanks.
-- Dmitry
| |