From: Yu Zhang <yuz08559@gmail.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org, Yu Zhang <yuz08559@gmail.com>
Subject: [PATCH] usb: gadget: f_printer: fix pnp_string use-after-free on reconfigure
Date: Thu, 15 Oct 2026 18:46:58 +1000 [thread overview]
Message-ID: <20261015084658.70918-1-yuz08559@gmail.com> (raw)
f_printer_opts_pnp_string_store() replaces opts->pnp_string with
kfree(old) + kstrndup(new) under opts->lock only, with no opts->refcnt
guard, so the IEEE-1284 ID string can be changed while the function is
bound and the gadget is enumerated.
printer_func_setup() answers the host GET_DEVICE_ID class request from
(soft)irq context and reads the string with no lock:
value = strlen(*dev->pnp_string);
...
memcpy(buf + 2, *dev->pnp_string, value);
dev->pnp_string points at &opts->pnp_string, so a concurrent configfs
write that frees the old string races the setup read -> use-after-free.
KASAN, a configfs writer racing a host GET_DEVICE_ID (reproduced over
dummy_hcd):
BUG: KASAN: slab-use-after-free in strlen+0xe/0x40
Read of size 1 at addr ffff888005036000 by task swapper/1/0
Call Trace:
<IRQ>
strlen+0xe/0x40
printer_func_setup+0x410/0x890
composite_setup+0x67e/0x4690
configfs_composite_setup+0xbb/0xd0
dummy_timer+0x1934/0x1e40
__hrtimer_run_queues+0x1b6/0x410
hrtimer_run_softirq+0x13a/0x260
Allocated by task 3486:
kstrndup+0xb2/0x130
f_printer_opts_pnp_string_store+0x3f/0xf0
configfs_write_iter+0x1a7/0x250
vfs_write+0x5df/0x940
ksys_write+0xfd/0x1e0
The setup path runs in atomic context and cannot take opts->lock, so
serialize by refusing to change pnp_string while the function is
instantiated, exactly as the sibling f_printer_opts_q_len_store() already
does for q_len. While the function is bound the string is then stable
for the lifetime of the live reader; it can still be changed when the
function is not linked into a gadget.
Fixes: 24b7ba2f88e0 ("usb: gadget: function: fix dangling pnp_string in f_printer.c")
Cc: stable@vger.kernel.org
Signed-off-by: Yu Zhang <yuz08559@gmail.com>
Tested-by: Yu Zhang <yuz08559@gmail.com>
---
drivers/usb/gadget/function/f_printer.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
index 1111111..2222222 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -1269,6 +1269,11 @@ static ssize_t f_printer_opts_pnp_string_store(struct config_item *item,
mutex_lock(&opts->lock);
+ if (opts->refcnt) {
+ result = -EBUSY;
+ goto unlock;
+ }
+
new_pnp = kstrndup(page, len, GFP_KERNEL);
if (!new_pnp) {
result = -ENOMEM;
--
2.43.0
next reply other threads:[~2026-10-15 8:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-15 8:46 Yu Zhang [this message]
2026-10-15 9:14 ` [PATCH] usb: gadget: f_printer: fix pnp_string use-after-free on reconfigure sashiko-bot
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=20261015084658.70918-1-yuz08559@gmail.com \
--to=yuz08559@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=stable@vger.kernel.org \
/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.