From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Jiri Kosina <jikos@kernel.org>
Cc: David Rheinsberg <david@readahead.eu>,
Peter Hutterer <peter.hutterer@who-t.net>,
Benjamin Tissoires <bentiss@kernel.org>,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Input: uinput/uhid - disallow control characters in phys paths
Date: Mon, 3 Aug 2026 18:47:23 -0700 [thread overview]
Message-ID: <anFDip3gGB4vEA8p@google.com> (raw)
In-Reply-To: <p3886qn6-q75n-8srq-49rp-09p86788s65o@xreary.bet>
On Mon, Aug 03, 2026 at 09:58:35PM +0200, Jiri Kosina wrote:
> On Fri, 24 Jul 2026, David Rheinsberg wrote:
>
> > > There is no good reason to support those, no physical device will ever
> > > produce those. Allowing \n in phys previously triggered CVE-2026-50292
> > > in libinput - there the PHYS udev property value was used as part of
> > > another udev property value. The linebreak then caused the property
> > > to be split across two lines, allowing uinput devices to inject
> > > malicious properties. While the bug is squarely inlibinput's court
> > > there still isn't a good reason for control characters in uinput/uhid.
> > >
> > > Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
> > > ---
> > > drivers/hid/uhid.c | 1 +
> > > drivers/input/misc/uinput.c | 1 +
> > > include/linux/input.h | 15 +++++++++++++++
> > > 3 files changed, 17 insertions(+)
> > >
> > > diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
> > > index 37b60c3aaf66..baf1fe8290f7 100644
> > > --- a/drivers/hid/uhid.c
> > > +++ b/drivers/hid/uhid.c
> > > @@ -513,16 +513,17 @@ static int uhid_dev_create2(struct uhid_device *uhid,
> > > ret = PTR_ERR(hid);
> > > goto err_free;
> > > }
> > >
> > > BUILD_BUG_ON(sizeof(hid->name) != sizeof(ev->u.create2.name));
> > > strscpy(hid->name, ev->u.create2.name, sizeof(hid->name));
> > > BUILD_BUG_ON(sizeof(hid->phys) != sizeof(ev->u.create2.phys));
> > > strscpy(hid->phys, ev->u.create2.phys, sizeof(hid->phys));
> > > + input_sanitize_phys(hid->phys);
> > > BUILD_BUG_ON(sizeof(hid->uniq) != sizeof(ev->u.create2.uniq));
> > > strscpy(hid->uniq, ev->u.create2.uniq, sizeof(hid->uniq));
> > >
> > > hid->ll_driver = &uhid_hid_driver;
> > > hid->bus = ev->u.create2.bus;
> > > hid->vendor = ev->u.create2.vendor;
> > > hid->product = ev->u.create2.product;
> > > hid->version = ev->u.create2.version;
> > > diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
> > > index d32fa4b508fc..70fe4f3e73bf 100644
> > > --- a/drivers/input/misc/uinput.c
> > > +++ b/drivers/input/misc/uinput.c
> > > @@ -998,16 +998,17 @@ static long uinput_ioctl_handler(struct file
> > > *file, unsigned int cmd,
> > >
> > > phys = strndup_user(p, 1024);
> > > if (IS_ERR(phys)) {
> > > retval = PTR_ERR(phys);
> > > goto out;
> > > }
> > >
> > > kfree(udev->dev->phys);
> > > + input_sanitize_phys(phys);
> > > udev->dev->phys = phys;
> > > goto out;
> > >
> > > case UI_BEGIN_FF_UPLOAD:
> > > retval = uinput_ff_upload_from_user(p, &ff_up);
> > > if (retval)
> > > goto out;
> > >
> > > diff --git a/include/linux/input.h b/include/linux/input.h
> > > index 76f7aa226202..6c182f5c783f 100644
> > > --- a/include/linux/input.h
> > > +++ b/include/linux/input.h
> > > @@ -527,16 +527,31 @@ int input_set_keycode(struct input_dev *dev,
> > >
> > > bool input_match_device_id(const struct input_dev *dev,
> > > const struct input_device_id *id);
> > >
> > > void input_enable_softrepeat(struct input_dev *dev, int delay, int period);
> > >
> > > bool input_device_enabled(struct input_dev *dev);
> > >
> > > +/**
> > > + * input_sanitize_phys - replace invalid characters in a phys string
> > > + * @phys: the phys path to sanitize (modified in place)
> > > + *
> > > + * Replaces any control characters and non-ASCII characters with '?'.
> > > + **/
> > > +static inline void input_sanitize_phys(char *phys)
> > > +{
> > > + char *p;
> > > +
> > > + for (p = phys; *p; p++)
> > > + if (*p < 0x20 || *p > 0x7e)
> > > + *p = '?';
> > > +}
> > > +
> >
> > Reviewed-by: David Rheinsberg <david@readahead.eu>
> >
> > I would also be fine to just reject them in uinput, but I guess this is the less intrusive option.
>
> Thanks for the fix.
>
> Dmitry, can you please Ack the above addition to input.h?
Jiri, as I mentioned I believe that if we need to sanitize phys we
should also sanitize other fields, especially given that they can be
set by userspace.
I also wonder why it needs to be inline? And what is wrong with using
isprint() here?
Thanks.
--
Dmitry
next prev parent reply other threads:[~2026-08-04 1:47 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-17 4:49 [PATCH] Input: uinput/uhid - disallow control characters in phys paths Peter Hutterer
2026-07-17 5:07 ` sashiko-bot
2026-07-23 5:54 ` Peter Hutterer
2026-07-24 23:51 ` Dmitry Torokhov
2026-07-24 7:51 ` David Rheinsberg
2026-08-03 19:58 ` Jiri Kosina
2026-08-04 1:47 ` Dmitry Torokhov [this message]
2026-08-04 6:15 ` Peter Hutterer
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=anFDip3gGB4vEA8p@google.com \
--to=dmitry.torokhov@gmail.com \
--cc=bentiss@kernel.org \
--cc=david@readahead.eu \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peter.hutterer@who-t.net \
/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.