From: sashiko-bot@kernel.org
To: "Michael Zaidman" <michael.zaidman@gmail.com>
Cc: dmitry.torokhov@gmail.com, linux-input@vger.kernel.org
Subject: Re: [PATCH 06/13] HID: ft260: i2c: reduce bus-error message severity
Date: Sat, 22 Aug 2026 21:52:05 +0000 [thread overview]
Message-ID: <20260822215206.5624B1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260822213941.98882-7-michael.zaidman@gmail.com>
Thank you for your contribution! Sashiko AI review found 6 potential issue(s) to consider:
New issues:
- [Low] Redundant `__func__` prefix in `ft260_dbg` logging.
Pre-existing issues:
- [High] Hardware is stopped after freeing device resources in `ft260_remove`, causing a Use-After-Free if a report arrives.
- [High] Accessing `dev` after it has been synchronously freed by `ft260_uart_port_remove`.
- [High] Double free of `dev` in the `ft260_probe` error path for UART interfaces.
- [High] The devres-managed GPIO chip remains active after the driver manually frees its context.
- [High] Improper cleanup order of workqueue and timer leads to a leaked work item and UAF.
--
--- Patch [6]: [PATCH 06/13] HID: ft260: i2c: reduce bus-error message severity ---
commit 726d7795b8219b2b5c0f6063a18546f73c323838
Author: Michael Zaidman <michael.zaidman@gmail.com>
HID: ft260: i2c: reduce bus-error message severity
This commit reduces the severity of I2C bus error messages during bus scans by
replacing hid_err with ft260_dbg. It keeps returning -EIO but avoids spamming
dmesg with routine failures.
> diff --git a/drivers/hid/hid-ft260.c b/drivers/hid/hid-ft260.c
> index 8db896f164cd0..1ed3701eaaf75 100644
> --- a/drivers/hid/hid-ft260.c
> +++ b/drivers/hid/hid-ft260.c
[ ... ]
> @@ -669,7 +669,7 @@ static int ft260_i2c_write(struct ft260_device *dev, u8 addr, u8 *data,
> ret = ft260_hid_output_report_check_status(dev, (u8 *)rep,
> wr_len + 4);
> if (ret < 0) {
> - hid_err(hdev, "%s: failed with %d\n", __func__, ret);
> + ft260_dbg("%s: failed with %d\n", __func__, ret);
[Severity: Low]
Does ft260_dbg already prepend the function name to the log output? If so,
keeping __func__ in the format string here might cause the function name to be
printed twice.
> return ret;
> }
>
[ ... ]
> @@ -710,7 +710,7 @@ static int ft260_smbus_write(struct ft260_device *dev, u8 addr, u8 cmd,
>
> ret = ft260_hid_output_report_check_status(dev, (u8 *)rep, len);
> if (ret < 0)
> - hid_err(dev->hdev, "%s: failed with %d\n", __func__, ret);
> + ft260_dbg("%s: failed with %d\n", __func__, ret);
[Severity: Low]
Similarly, does this result in a redundant function name in the log output?
>
> return ret;
> }
While reviewing this code, I also noticed a few other items in the driver.
[Severity: High]
This is a pre-existing issue, but is it possible for a use-after-free to occur
during device unbind in ft260_remove()?
drivers/hid/hid-ft260.c:ft260_remove() {
...
kfree(dev);
...
hid_hw_stop(hdev);
}
Because hid_hw_stop() is called at the end of the function, the HID hardware
is still active and can process incoming reports. If a report arrives, it
triggers ft260_raw_event() which accesses the already freed dev:
drivers/hid/hid-ft260.c:ft260_raw_event() {
struct ft260_device *dev = hid_get_drvdata(hdev);
...
}
Can this sequence be triggered by hot-unplugging or receiving interrupts
during removal?
[Severity: High]
This isn't a bug introduced by this patch, but does ft260_remove() access dev
after it has been synchronously freed?
drivers/hid/hid-ft260.c:ft260_remove() {
...
ft260_uart_port_remove(dev);
/* dev is still needed, so we will free it in _destroy func */
if (dev->iface_id == 0)
...
}
If the port is not actively opened by userspace, ft260_uart_port_remove()
drops the tty_port refcount to 0, which invokes the destructor and frees dev.
Is it safe to access dev->iface_id immediately after this call?
[Severity: High]
This is a pre-existing issue, but could the error path in ft260_probe() lead
to a double free for UART interfaces?
drivers/hid/hid-ft260.c:ft260_uart_probe() {
...
err_register_tty:
ft260_uart_port_remove(dev);
return ret;
}
If ft260_uart_probe() fails and drops the port reference, dev is freed. The
failure propagates back to ft260_probe(), which then executes:
drivers/hid/hid-ft260.c:ft260_probe() {
...
hid_fail:
kfree(dev);
}
Does this cause kfree(dev) to be called on an already freed pointer?
[Severity: High]
This isn't a bug introduced by this patch, but does devres leave the GPIO chip
active after its private data is freed?
drivers/hid/hid-ft260.c:ft260_remove() {
...
i2c_del_adapter(&dev->adap);
kfree(dev);
}
The driver registers a GPIO chip using devm_gpiochip_add_data() and assigns
dev as its private data. Since devres automatically cleans up the GPIO chip
only after the remove callback fully completes, can userspace race to invoke
GPIO operations during this window and dereference the freed dev?
[Severity: High]
This is a pre-existing issue, but does the cleanup order of the timer and
workqueue leak a work item and cause a use-after-free?
drivers/hid/hid-ft260.c:ft260_remove() {
...
cancel_work_sync(&dev->wakeup_work);
...
ft260_uart_port_remove(dev);
}
drivers/hid/hid-ft260.c:ft260_uart_port_remove() {
...
timer_delete_sync(&port->wakeup_timer);
}
Since cancel_work_sync() is invoked before the timer is shut down, could the
timer fire concurrently and invoke schedule_work() again? This would leave a
pending work item that executes after the driver is unloaded and its private
data freed. Should timer_delete_sync() occur before cancel_work_sync()?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260822213941.98882-1-michael.zaidman@gmail.com?part=6
next prev parent reply other threads:[~2026-08-22 21:52 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-22 21:39 [PATCH 00/13] HID: ft260: add UART and GPIO support, plus I2C fixes Michael Zaidman
2026-08-22 21:39 ` [PATCH 01/13] HID: ft260: add serial driver Michael Zaidman
2026-08-22 22:00 ` sashiko-bot
2026-08-25 7:49 ` Linus Walleij
2026-08-25 8:12 ` Linus Walleij
2026-08-27 19:16 ` Michael Zaidman
2026-08-22 21:39 ` [PATCH 02/13] HID: ft260: uart: bring-up fixes Michael Zaidman
2026-08-22 21:56 ` sashiko-bot
2026-08-22 21:39 ` [PATCH 03/13] HID: ft260: add GPIO support on top of UART Michael Zaidman
2026-08-22 21:56 ` sashiko-bot
2026-08-25 7:44 ` Linus Walleij
2026-08-27 20:39 ` Michael Zaidman
2026-08-22 21:39 ` [PATCH 04/13] HID: ft260: i2c: reduce driver module loading time Michael Zaidman
2026-08-22 21:51 ` sashiko-bot
2026-08-22 21:39 ` [PATCH 05/13] HID: ft260: i2c: silence sysfs store big-numbers Michael Zaidman
2026-08-22 21:51 ` sashiko-bot
2026-08-22 21:39 ` [PATCH 06/13] HID: ft260: i2c: reduce bus-error message severity Michael Zaidman
2026-08-22 21:52 ` sashiko-bot [this message]
2026-08-22 21:39 ` [PATCH 07/13] HID: ft260: uart: enable flow control Michael Zaidman
2026-08-22 21:52 ` sashiko-bot
2026-08-22 21:39 ` [PATCH 08/13] HID: ft260: uart: add modem pins control via ioctl Michael Zaidman
2026-08-22 21:54 ` sashiko-bot
2026-08-25 8:08 ` Linus Walleij
2026-08-27 22:08 ` Michael Zaidman
2026-08-22 21:39 ` [PATCH 09/13] HID: ft260: gpio: group sysfs attrs per HID interface Michael Zaidman
2026-08-22 21:54 ` sashiko-bot
2026-08-25 8:13 ` Linus Walleij
2026-08-27 20:50 ` Michael Zaidman
2026-08-22 21:39 ` [PATCH 10/13] HID: ft260: uart: fix active-low RTS/CTS/DTR/DSR polarity Michael Zaidman
2026-08-22 22:03 ` sashiko-bot
2026-08-25 8:16 ` Linus Walleij
2026-08-27 21:08 ` Michael Zaidman
2026-08-22 21:39 ` [PATCH 11/13] HID: ft260: i2c: fix large write transaction failure Michael Zaidman
2026-08-22 22:02 ` sashiko-bot
2026-08-22 21:39 ` [PATCH 12/13] HID: ft260: workaround for TN_189 errata endpoint STALL after enumeration Michael Zaidman
2026-08-22 22:03 ` sashiko-bot
2026-08-22 21:39 ` [PATCH 13/13] HID: ft260: i2c: abort in-flight transfers with STOP before reset Michael Zaidman
2026-08-22 22:12 ` sashiko-bot
2026-08-25 8:21 ` [PATCH 00/13] HID: ft260: add UART and GPIO support, plus I2C fixes Linus Walleij
2026-08-27 13:27 ` Lee Jones
2026-08-27 18:53 ` Michael Zaidman
2026-08-27 20:51 ` Lee Jones
2026-08-27 22:25 ` Michael Zaidman
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=20260822215206.5624B1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=michael.zaidman@gmail.com \
--cc=sashiko-reviews@lists.linux.dev \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox