From: Slawomir Stepien <sst@poczta.fm>
To: syzbot <syzbot@kernel.org>
Cc: syzkaller-upstream-moderation@googlegroups.com, syzbot@lists.linux.dev
Subject: Re: [PATCH RFC] Input: yealink - abort URB submission on fatal errors
Date: Mon, 14 Sep 2026 10:08:06 +0200 [thread overview]
Message-ID: <aqerZhAv7Wyd3DoO@nr200> (raw)
In-Reply-To: <57cf484d-3235-473f-a61d-570585626176@mail.kernel.org>
On lip 22, 2026 17:46, 'syzbot' via syzkaller-upstream-moderation wrote:
> The yealink driver uses two URBs (interrupt and control) to communicate
> with the device. When an URB completes with an error status (such as
> -EPROTO), the completion handlers (urb_irq_callback and urb_ctl_callback)
> log the error but do not abort. Instead, they proceed to process the
> potentially invalid data and unconditionally resubmit the URB.
>
> Because control URBs are not rate-limited by the USB core, resubmitting a
> failing control URB in a tight loop floods the console with error messages
> and keeps the CPU completely busy in the softirq context. This eventually
> triggers an RCU preempt stall:
>
> yealink 3-1:36.0: unexpected response 0
> yealink 3-1:36.0: urb_ctl_callback - urb status -71
> rcu: INFO: rcu_preempt self-detected stall on CPU
> Call Trace:
> __console_flush_and_unlock kernel/printk/printk.c:3373 [inline]
> console_unlock+0xd1/0x1c0 kernel/printk/printk.c:3413
> dev_vprintk_emit+0x338/0x400 drivers/base/core.c:4996
> dev_printk_emit+0xee/0x140 drivers/base/core.c:5007
> usb_generic_driver_probe+0x10b/0x150 drivers/usb/core/generic.c:252
> ...
> hub_event+0x28e8/0x4d30 drivers/usb/core/hub.c:5953
> worker_thread+0x92d/0xe10 kernel/workqueue.c:3486
> kthread+0x388/0x470 kernel/kthread.c:436
>
> Fix this by explicitly checking the URB status for fatal errors (-ENOENT,
> -ECONNRESET, -ESHUTDOWN, -EPROTO, -EPIPE, -EILSEQ) in both
> urb_irq_callback() and urb_ctl_callback(). If a fatal error is detected,
> the callback now returns early, breaking the infinite resubmission loop and
> preventing the RCU stall.
>
> Fixes: aca951a22a1d ("[PATCH] input-driver-yealink-P1K-usb-phone")
> Assisted-by: Gemini:gemini-3.5-flash Gemini:gemini-3.1-pro-preview syzbot
> Reported-by: syzbot+78e2288f58b881ed3c45@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=78e2288f58b881ed3c45
> Link: https://syzkaller.appspot.com/ai_job?id=6ef5721d-1286-4deb-85e1-d7201e028127
> To: "Henk Vergonet" <Henk.Vergonet@gmail.com>
> To: "Dmitry Torokhov" <dmitry.torokhov@gmail.com>
> To: <linux-input@vger.kernel.org>
> Cc: <linux-kernel@vger.kernel.org>
>
> ---
> diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c
> index 560f895a0..232d8e71b 100644
> --- a/drivers/input/misc/yealink.c
> +++ b/drivers/input/misc/yealink.c
> @@ -405,9 +405,21 @@ static void urb_irq_callback(struct urb *urb)
> struct yealink_dev *yld = urb->context;
> int ret, status = urb->status;
>
> - if (status)
> + if (status) {
> dev_err(&yld->intf->dev, "%s - urb status %d\n",
> __func__, status);
> + switch (status) {
> + case -ENOENT:
> + case -ECONNRESET:
> + case -ESHUTDOWN:
> + case -EPROTO:
> + case -EPIPE:
> + case -EILSEQ:
> + return;
> + default:
> + break;
> + }
> + }
>
> switch (yld->irq_data->cmd) {
> case CMD_KEYPRESS:
> @@ -443,9 +455,21 @@ static void urb_ctl_callback(struct urb *urb)
> struct yealink_dev *yld = urb->context;
> int ret = 0, status = urb->status;
>
> - if (status)
> + if (status) {
> dev_err(&yld->intf->dev, "%s - urb status %d\n",
> __func__, status);
> + switch (status) {
> + case -ENOENT:
> + case -ECONNRESET:
> + case -ESHUTDOWN:
> + case -EPROTO:
> + case -EPIPE:
> + case -EILSEQ:
> + return;
> + default:
> + break;
> + }
> + }
How about putting the switch statement in a separate function, so we can use it in both callbacks? I
would be easier that way to update the list of fatal errors.
> switch (yld->ctl_data->cmd) {
> case CMD_KEYPRESS:
>
>
> base-commit: 1590cf0329716306e948a8fc29f1d3ee87d3989f
--
Slawomir Stepien
prev parent reply other threads:[~2026-09-14 8:08 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-22 17:46 [PATCH RFC] Input: yealink - abort URB submission on fatal errors syzbot
2026-09-14 8:08 ` Slawomir Stepien [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=aqerZhAv7Wyd3DoO@nr200 \
--to=sst@poczta.fm \
--cc=syzbot@kernel.org \
--cc=syzbot@lists.linux.dev \
--cc=syzkaller-upstream-moderation@googlegroups.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.