* [PATCH] usb: typec: ucsi: Fix NULL pointer dereference in power level debugfs
@ 2026-10-10 12:03 Bertrand Jacquin
2026-10-12 3:16 ` Huang Wei
2026-10-26 11:40 ` Heikki Krogerus
0 siblings, 2 replies; 3+ messages in thread
From: Bertrand Jacquin @ 2026-10-10 12:03 UTC (permalink / raw)
To: heikki.krogerus, gregkh; +Cc: venkat.jayaraman, linux-usb, linux-kernel, stable
ucsi_register() creates the debugfs entries right away, but
ucsi->connector is only set by ucsi_init(), which runs later from
ucsi->work and only publishes the connectors once the PPM has been
reset and all ports are registered. Until then, or for good if init
fails, ucsi->connector is NULL, yet the peak_current, avg_current and
vbus_voltage show callbacks dereference it unconditionally.
On an Intel NUC13ANKi5 whose PPM never answers when CONFIG_ACPI_EC=n,
reading those files after the failed init oopses:
ucsi_acpi USBC000:00: error -ETIMEDOUT: PPM init failed
BUG: kernel NULL pointer dereference, address: 000000000000045c
#PF: supervisor read access in kernel mode
RIP: 0010:ucsi_debugfs_register+0x291/0x420 [typec_ucsi]
Call Trace:
<TASK>
seq_read_iter+0x1e4/0x4c0
seq_read+0x12b/0x160
full_proxy_read+0x9a/0x1f0
vfs_read+0xba/0x320
ksys_read+0x74/0x110
do_syscall_64+0x79/0x240
entry_SYSCALL_64_after_hwframe+0x71/0x79
Return -ENODEV from those callbacks while no connector is available.
Fixes: c851b71fd6cd ("usb: typec: ucsi: Add support for READ_POWER_LEVEL command")
Cc: stable@vger.kernel.org
Signed-off-by: Bertrand Jacquin <bertrand@jacquin.bzh>
---
drivers/usb/typec/ucsi/debugfs.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/usb/typec/ucsi/debugfs.c b/drivers/usb/typec/ucsi/debugfs.c
index 77a0dd75edd3..911a151ac16a 100644
--- a/drivers/usb/typec/ucsi/debugfs.c
+++ b/drivers/usb/typec/ucsi/debugfs.c
@@ -92,6 +92,9 @@ static int ucsi_peak_curr_show(struct seq_file *m, void *v)
{
struct ucsi *ucsi = m->private;
+ if (!ucsi->connector)
+ return -ENODEV;
+
seq_printf(m, "%u mA\n", ucsi->connector->peak_current);
return 0;
}
@@ -101,6 +104,9 @@ static int ucsi_avg_curr_show(struct seq_file *m, void *v)
{
struct ucsi *ucsi = m->private;
+ if (!ucsi->connector)
+ return -ENODEV;
+
seq_printf(m, "%u mA\n", ucsi->connector->avg_current);
return 0;
}
@@ -110,6 +116,9 @@ static int ucsi_vbus_volt_show(struct seq_file *m, void *v)
{
struct ucsi *ucsi = m->private;
+ if (!ucsi->connector)
+ return -ENODEV;
+
seq_printf(m, "%u mV\n", ucsi->connector->vbus_voltage);
return 0;
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] usb: typec: ucsi: Fix NULL pointer dereference in power level debugfs
2026-10-10 12:03 [PATCH] usb: typec: ucsi: Fix NULL pointer dereference in power level debugfs Bertrand Jacquin
@ 2026-10-12 3:16 ` Huang Wei
2026-10-26 11:40 ` Heikki Krogerus
1 sibling, 0 replies; 3+ messages in thread
From: Huang Wei @ 2026-10-12 3:16 UTC (permalink / raw)
To: Bertrand Jacquin
Cc: Heikki Krogerus, Greg Kroah-Hartman, Venkat Jayaraman, linux-usb,
linux-kernel, stable, huangwei
Hi Bertrand,
I checked this over. The window is real - ucsi_register() creates the
debugfs entries right away while ucsi->connector is only assigned at
the end of ucsi_init(), so on the PPM-init-failed path those three
files stay reachable with a NULL connector.
I also grepped debugfs.c for other ucsi->connector dereferences - the
three show functions the patch guards are the only ones (ucsi_resp
and the command interface go through ucsi->debugfs), so the fix is
complete.
One thing I'd note in favour of guarding rather than moving
ucsi_debugfs_register() after connector assignment: the command and
response files are exactly what you want available when the PPM is
misbehaving, so keeping the early registration and just making the
power-level reads fail cleanly looks like the better shape to me.
Reviewed-by: Huang Wei <huangwei@kylinos.cn>
Thanks,
Huang Wei
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] usb: typec: ucsi: Fix NULL pointer dereference in power level debugfs
2026-10-10 12:03 [PATCH] usb: typec: ucsi: Fix NULL pointer dereference in power level debugfs Bertrand Jacquin
2026-10-12 3:16 ` Huang Wei
@ 2026-10-26 11:40 ` Heikki Krogerus
1 sibling, 0 replies; 3+ messages in thread
From: Heikki Krogerus @ 2026-10-26 11:40 UTC (permalink / raw)
To: Bertrand Jacquin
Cc: gregkh, venkat.jayaraman, linux-usb, linux-kernel, stable
On Sat, Oct 10, 2026 at 01:03:57PM +0100, Bertrand Jacquin wrote:
> ucsi_register() creates the debugfs entries right away, but
> ucsi->connector is only set by ucsi_init(), which runs later from
> ucsi->work and only publishes the connectors once the PPM has been
> reset and all ports are registered. Until then, or for good if init
> fails, ucsi->connector is NULL, yet the peak_current, avg_current and
> vbus_voltage show callbacks dereference it unconditionally.
>
> On an Intel NUC13ANKi5 whose PPM never answers when CONFIG_ACPI_EC=n,
> reading those files after the failed init oopses:
>
> ucsi_acpi USBC000:00: error -ETIMEDOUT: PPM init failed
> BUG: kernel NULL pointer dereference, address: 000000000000045c
> #PF: supervisor read access in kernel mode
> RIP: 0010:ucsi_debugfs_register+0x291/0x420 [typec_ucsi]
> Call Trace:
> <TASK>
> seq_read_iter+0x1e4/0x4c0
> seq_read+0x12b/0x160
> full_proxy_read+0x9a/0x1f0
> vfs_read+0xba/0x320
> ksys_read+0x74/0x110
> do_syscall_64+0x79/0x240
> entry_SYSCALL_64_after_hwframe+0x71/0x79
>
> Return -ENODEV from those callbacks while no connector is available.
>
> Fixes: c851b71fd6cd ("usb: typec: ucsi: Add support for READ_POWER_LEVEL command")
> Cc: stable@vger.kernel.org
> Signed-off-by: Bertrand Jacquin <bertrand@jacquin.bzh>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> drivers/usb/typec/ucsi/debugfs.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/drivers/usb/typec/ucsi/debugfs.c b/drivers/usb/typec/ucsi/debugfs.c
> index 77a0dd75edd3..911a151ac16a 100644
> --- a/drivers/usb/typec/ucsi/debugfs.c
> +++ b/drivers/usb/typec/ucsi/debugfs.c
> @@ -92,6 +92,9 @@ static int ucsi_peak_curr_show(struct seq_file *m, void *v)
> {
> struct ucsi *ucsi = m->private;
>
> + if (!ucsi->connector)
> + return -ENODEV;
> +
> seq_printf(m, "%u mA\n", ucsi->connector->peak_current);
> return 0;
> }
> @@ -101,6 +104,9 @@ static int ucsi_avg_curr_show(struct seq_file *m, void *v)
> {
> struct ucsi *ucsi = m->private;
>
> + if (!ucsi->connector)
> + return -ENODEV;
> +
> seq_printf(m, "%u mA\n", ucsi->connector->avg_current);
> return 0;
> }
> @@ -110,6 +116,9 @@ static int ucsi_vbus_volt_show(struct seq_file *m, void *v)
> {
> struct ucsi *ucsi = m->private;
>
> + if (!ucsi->connector)
> + return -ENODEV;
> +
> seq_printf(m, "%u mV\n", ucsi->connector->vbus_voltage);
> return 0;
> }
--
heikki
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-26 11:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-10 12:03 [PATCH] usb: typec: ucsi: Fix NULL pointer dereference in power level debugfs Bertrand Jacquin
2026-10-12 3:16 ` Huang Wei
2026-10-26 11:40 ` Heikki Krogerus
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®