All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alejandro Colomar <alx+linux-hardening@kernel.org>
To: David Laight <david.laight.linux@gmail.com>
Cc: Mariia Nikitash <nikitash.mariiaw@gmail.com>,
	 dmitry.torokhov@gmail.com, linux-input@vger.kernel.org,
	linux-kernel@vger.kernel.org,  linux-hardening@vger.kernel.org,
	kees@kernel.org, justinstitt@google.com, morbo@google.com
Subject: Re: [PATCH] Input: mouse: vsxxxaa: Replace strlcat() with strscpy()
Date: Thu, 5 Nov 2026 12:49:59 +0100	[thread overview]
Message-ID: <auxrRmyg50gvP1HE@devuan> (raw)
In-Reply-To: <20261105112813.13210334@pumpkin>

[-- Attachment #1: Type: text/plain, Size: 3671 bytes --]

Hi David,

> Date: 2026-11-05 11:28:13+0000
> From: David Laight <david.laight.linux@gmail.com>
>
> On Tue,  3 Nov 2026 22:23:18 -0800
> Mariia Nikitash <nikitash.mariiaw@gmail.com> wrote:
> 
> > In preparation for removing the deprecated strlcat() API[1], use
> > strscpy() to initialize the mouse device name.
> > 
> > The destination is zero-initialized, and the constant string fits
> > within the buffer. Since the return value is unused, this preserves
> > the existing behavior.
> > 
> > Link: https://github.com/KSPP/linux/issues/370 [1]
> > Signed-off-by: Mariia Nikitash <nikitash.mariiaw@gmail.com>
> > ---
> >  drivers/input/mouse/vsxxxaa.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/input/mouse/vsxxxaa.c b/drivers/input/mouse/vsxxxaa.c
> > index 042a17fe81db..b3a0d7ff5738 100644
> > --- a/drivers/input/mouse/vsxxxaa.c
> > +++ b/drivers/input/mouse/vsxxxaa.c
> > @@ -463,8 +463,8 @@ static int vsxxxaa_connect(struct serio *serio, struct serio_driver *drv)
> >  
> >  	mouse->dev = input_dev;
> >  	mouse->serio = serio;
> > -	strlcat(mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer",
> > -		 sizeof(mouse->name));
> > +	strscpy(mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer",
> > +		sizeof(mouse->name));
> 
> You might as well use the 2 argument form.
> Moreover, if you use strcpy() you'll get a compile-time error if the
> string doesn't fit.
> strscpy() will truncate and return an errors.
> 
> The other question is whether mouse->name even has to be char[].
> 
> Personally I think that while there are issues with strlcat()
> (mostly to do with its return value), and that there are often
> much better (and faster - so sprintf is out) ways of getting
> the same result, the deprecation really needs to propose a
> sensible alternative (not inlined strlen() + strscpy()).

One alternative would be to add strscat(), with the obvious internal
strlen(3).  This would be a drop-in replacement, and wouldn't have the
issues of strlcat(3) --mainly, the DoS vulnerability which is
consequence of the return value, and also the more difficult error
handling of doing '>=sizeof(...)' than '<0'--.

There's an implementation of strscat() in shadow-utils, where we call it
strtcat() --because what it does is Truncating the string, so a T feels
more appropriate--:
<https://github.com/shadow-maint/shadow/blob/214a2e6e0a5f81fa281b272be7cf9e9d3aff8f34/lib/string/strcpy/strtcat.h#L28>

Another alternative which would avoid the internal strlen(3) call, and
thus would be faster, would be to add a stpecpy() function, similar to
stpcpy(3), but which would take a pointer one-past-the-last element in
the buffer, to perform truncation.  This is fundamentally Plan9's
strecpy(2), except that Plan9's API has a bug.

There's an implementation of stpecpy() in shadow-utils:
<https://github.com/shadow-maint/shadow/blob/214a2e6e0a5f81fa281b272be7cf9e9d3aff8f34/lib/string/strcpy/stpecpy.h#L28>

We've been using stpecpy() quite extensively in shadow-utils, and it's
a great API.  Of course, there's also the decades-long experience in
Plan9, which apart from their bug --which I found, by comparing their
implementation to mine--, shows that it's a quite useful API.

And stpecpy() produces the simplest code of all truncating functions.


Have a lovely day!
Alex

> This case is, of course one of the 'better ways' cases.
> 
> David
> 
> >  	snprintf(mouse->phys, sizeof(mouse->phys), "%s/input0", serio->phys);
> >  
> >  	input_dev->name = mouse->name;
> 
> 

-- 
<https://www.alejandro-colomar.es>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2026-11-05 11:50 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-04  6:23 [PATCH] Input: mouse: vsxxxaa: Replace strlcat() with strscpy() Mariia Nikitash
2026-11-04 11:21 ` Alejandro Colomar
2026-11-04 16:33 ` Shihuang Liu
2026-11-05 11:28 ` David Laight
2026-11-05 11:49   ` Alejandro Colomar [this message]
2026-11-05 20:53     ` David Laight
2026-11-05 21:39       ` Alejandro Colomar

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=auxrRmyg50gvP1HE@devuan \
    --to=alx+linux-hardening@kernel.org \
    --cc=david.laight.linux@gmail.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=justinstitt@google.com \
    --cc=kees@kernel.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=morbo@google.com \
    --cc=nikitash.mariiaw@gmail.com \
    /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.