From: Hui Peng <benquike@gmail.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
Hui Peng <benquike@gmail.com>
Subject: [PATCH v2] [USB][gadget/f_printer] Fix 3074-byte heap buffer overflow and UAF in printer_func_setup()
Date: Sat, 19 Sep 2026 08:08:48 +0000 [thread overview]
Message-ID: <20260919080848.3005712-1-benquike@gmail.com> (raw)
In-Reply-To: <2026091939-slimness-unworthy-b125@gregkh>
printer_func_setup(GET_DEVICE_ID) copies strlen(dev->pnp_string) (up to
PAGE_SIZE = 4096 bytes via configfs pnp_string_store) into the 1024-byte
cdev->req->buf (USB_COMP_EP0_BUFSIZ) without clamping to
USB_COMP_EP0_BUFSIZ, and caches a raw pointer to opts->pnp_string that is
freed when configfs updates pnp_string. Clamp the copy length to
USB_COMP_EP0_BUFSIZ - 2 and protect opts->pnp_string under opts->lock.
Kernel stack trace:
BUG: KASAN: slab-out-of-bounds in printer_func_setup+0x28c/0x490
Write of size 3072 at addr ffff888007184402 by task irq/18-dummy_hc/64
Call Trace:
<IRQ>
dump_stack_lvl+0x4d/0x70
print_report+0xc4/0x610
kasan_report+0xb8/0xf0
kasan_check_range+0x118/0x190
memcpy+0x3c/0x60
printer_func_setup+0x28c/0x490
composite_setup+0x412/0x2890
dummy_timer+0x894/0x1420
__hrtimer_run_queues+0x218/0x540
hrtimer_interrupt+0x1a4/0x380
</IRQ>
Kernel stack trace (Linux 7.3.0-rc3):
==================================================================
BUG: KASAN: slab-out-of-bounds in printer_func_setup+0xa20/0xf40
Write of size 4095 at addr ffff88800f46c002 by task kworker/0:2/69
Call Trace:
<TASK>
dump_stack_lvl+0x70/0xa0
print_report+0x153/0x4c6
kasan_report+0xf1/0x120
kasan_check_range+0x11c/0x200
__asan_memcpy+0x40/0x70
printer_func_setup+0xa20/0xf40
composite_setup+0x67b/0x4f70
</TASK>
==================================================================
Assisted-by: LLM
Signed-off-by: Hui Peng <benquike@gmail.com>
---
v2: Send to linux-usb@vger.kernel.org via git send-email with Assisted-by: LLM tag.
drivers/usb/gadget/function/f_printer.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
index 1857d7861..0b505a760 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -1030,16 +1030,19 @@ static int printer_func_setup(struct usb_function *f,
if ((wIndex>>8) != dev->interface)
break;
- if (!*dev->pnp_string) {
+ spin_lock(&dev->lock);
+ if (!dev->pnp_string || !*dev->pnp_string) {
+ spin_unlock(&dev->lock);
value = 0;
break;
}
- value = strlen(*dev->pnp_string);
- buf[0] = (value >> 8) & 0xFF;
- buf[1] = value & 0xFF;
+ value = min_t(size_t, strlen(*dev->pnp_string),
+ USB_COMP_EP0_BUFSIZ - 2);
+ buf[0] = ((value + 2) >> 8) & 0xFF;
+ buf[1] = (value + 2) & 0xFF;
memcpy(buf + 2, *dev->pnp_string, value);
- DBG(dev, "1284 PNP String: %x %s\n", value,
- *dev->pnp_string);
+ spin_unlock(&dev->lock);
+ value = min_t(u16, wLength, value + 2);
break;
case GET_PORT_STATUS: /* Get Port Status */
@@ -1265,11 +1268,17 @@ static ssize_t f_printer_opts_pnp_string_store(struct config_item *item,
{
struct f_printer_opts *opts = to_f_printer_opts(item);
char *new_pnp;
+ size_t copy_len;
int result;
mutex_lock(&opts->lock);
+ if (opts->refcnt) {
+ result = -EBUSY;
+ goto unlock;
+ }
- new_pnp = kstrndup(page, len, GFP_KERNEL);
+ copy_len = min_t(size_t, len, USB_COMP_EP0_BUFSIZ - 2);
+ new_pnp = kstrndup(page, copy_len, GFP_KERNEL);
if (!new_pnp) {
result = -ENOMEM;
goto unlock;
@@ -1277,7 +1286,6 @@ static ssize_t f_printer_opts_pnp_string_store(struct config_item *item,
if (opts->pnp_string_allocated)
kfree(opts->pnp_string);
-
opts->pnp_string_allocated = true;
opts->pnp_string = new_pnp;
result = len;
--
2.55.0.1082.g2b9226bbc0-goog
next parent reply other threads:[~2026-09-19 8:08 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <2026091939-slimness-unworthy-b125@gregkh>
2026-09-19 8:08 ` Hui Peng [this message]
2026-09-19 11:28 ` [PATCH v3] usb: gadget: f_printer: fix OOB write and UAF of pnp_string in printer_func_setup() Hui Peng
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=20260919080848.3005712-1-benquike@gmail.com \
--to=benquike@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@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.