All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee@kernel.org>
To: David Lechner <david@lechnology.com>
Cc: Ivan Stepchenko <sid@itb.spb.ru>, Pavel Machek <pavel@kernel.org>,
	Jacek Anaszewski <j.anaszewski@samsung.com>,
	linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org,
	lvc-project@linuxtesting.org
Subject: Re: [PATCH] leds: uleds: fix unchecked copy_to_user() in uleds_read()
Date: Fri, 9 May 2025 09:46:52 +0100	[thread overview]
Message-ID: <20250509084652.GA2492385@google.com> (raw)
In-Reply-To: <037fc605-3401-4e68-b452-b5e4882d56bc@lechnology.com>

On Thu, 08 May 2025, David Lechner wrote:

> On 5/8/25 9:34 AM, Lee Jones wrote:
> > On Mon, 05 May 2025, Ivan Stepchenko wrote:
> > 
> >> The copy_to_user() is annotated with __must_check, indicating that
> >> its return value must be checked by the caller. Currently, uleds_read()
> >> ignores it. If the userspace buffer is invalid and copy_to_user() fails,
> >> the userspace application may assume it has received fresh data, while
> >> in fact copying has failed. This can leave applications out of sync
> >> with the actual device state.
> >>
> >> Found by Linux Verification Center (linuxtesting.org) with SVACE.
> >>
> >> Fixes: e381322b0190 ("leds: Introduce userspace LED class driver")
> >> Signed-off-by: Ivan Stepchenko <sid@itb.spb.ru>
> >> ---
> >>  drivers/leds/uleds.c | 11 +++++++----
> >>  1 file changed, 7 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/drivers/leds/uleds.c b/drivers/leds/uleds.c
> >> index 374a841f18c3..41bfce43136c 100644
> >> --- a/drivers/leds/uleds.c
> >> +++ b/drivers/leds/uleds.c
> >> @@ -147,10 +147,13 @@ static ssize_t uleds_read(struct file *file, char __user *buffer, size_t count,
> >>  		} else if (!udev->new_data && (file->f_flags & O_NONBLOCK)) {
> >>  			retval = -EAGAIN;
> >>  		} else if (udev->new_data) {
> >> -			retval = copy_to_user(buffer, &udev->brightness,
> >> -					      sizeof(udev->brightness));
> >> -			udev->new_data = false;
> >> -			retval = sizeof(udev->brightness);
> >> +			if (copy_to_user(buffer, &udev->brightness,
> >> +					 sizeof(udev->brightness))) {
> > 
> > This is not good.
> > 
> > Please store the result into a variable and return that instead.
> 
> Every other caller of copy_to_user() in the kernel I've seen ignores the actual
> return value and returns -EFAULT, so I thought this looked correct and it was
> just a quirk of copy_to_user().

Yes, I think you're right.  Interesting.

So my counterproposal is as follows:

--- a/drivers/leds/uleds.c
+++ b/drivers/leds/uleds.c
@@ -147,10 +147,11 @@ static ssize_t uleds_read(struct file *file, char __user *buffer, size_t count,
                } else if (!udev->new_data && (file->f_flags & O_NONBLOCK)) {
                        retval = -EAGAIN;
                } else if (udev->new_data) {
-                       retval = copy_to_user(buffer, &udev->brightness,
-                                             sizeof(udev->brightness));
-                       udev->new_data = false;
-                       retval = sizeof(udev->brightness);
+                       ssize_t size = retval = sizeof(udev->brightness);
+                       if (copy_to_user(buffer, &udev->brightness, size))
+                               retval = -EFAULT;
+                       else
+                               udev->new_data = false;
                }

                mutex_unlock(&udev->mutex);

> >> +				retval = -EFAULT;
> >> +			} else {
> >> +				udev->new_data = false;
> >> +				retval = sizeof(udev->brightness);
> >> +			}
> >>  		}
> >>  
> >>  		mutex_unlock(&udev->mutex);
> >> -- 
> >> 2.39.5
> >>
> > 
> 

-- 
Lee Jones [李琼斯]

      reply	other threads:[~2025-05-09  8:46 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-05  8:13 [PATCH] leds: uleds: fix unchecked copy_to_user() in uleds_read() Ivan Stepchenko
2025-05-08 14:34 ` Lee Jones
2025-05-08 15:03   ` David Lechner
2025-05-09  8:46     ` Lee Jones [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=20250509084652.GA2492385@google.com \
    --to=lee@kernel.org \
    --cc=david@lechnology.com \
    --cc=j.anaszewski@samsung.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-leds@vger.kernel.org \
    --cc=lvc-project@linuxtesting.org \
    --cc=pavel@kernel.org \
    --cc=sid@itb.spb.ru \
    /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.