All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ryan Mallon <rmallon@gmail.com>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: rydberg@euromail.se, carl@ok-labs.com,
	linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/2] uinput: Support injecting multiple events in one write() call
Date: Wed, 11 Sep 2013 10:29:41 +1000	[thread overview]
Message-ID: <522FB975.4010508@gmail.com> (raw)
In-Reply-To: <20130911001428.GB5840@core.coreip.homeip.net>

On 11/09/13 10:14, Dmitry Torokhov wrote:
> 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.

Good point. evdev is also broken in this regard, I'll send a follow-up
patch for that once you are happy with this one. Updated patch is below:

~Ryan

---
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
index a0a4bba..92ca2c5 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 *u
                                   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 bytes ?: -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,


      reply	other threads:[~2013-09-11  0:29 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-10 23:32 [PATCH 1/2] uinput: Support injecting multiple events in one write() call Ryan Mallon
2013-09-10 23:32 ` [PATCH 2/2] uinput: Use input_inject_event in uinput_inject_event Ryan Mallon
2013-09-11  0:12   ` Dmitry Torokhov
2013-09-11  0:26     ` Ryan Mallon
2013-09-11  0:14 ` [PATCH 1/2] uinput: Support injecting multiple events in one write() call Dmitry Torokhov
2013-09-11  0:29   ` Ryan Mallon [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=522FB975.4010508@gmail.com \
    --to=rmallon@gmail.com \
    --cc=carl@ok-labs.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rydberg@euromail.se \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.