Skip to content

Commit b13abcb

Browse files
Andrei Kuchynskigregkh
authored andcommitted
usb: typec: ucsi: Fix NULL pointer access
Resources should be released only after all threads that utilize them have been destroyed. This commit ensures that resources are not released prematurely by waiting for the associated workqueue to complete before deallocating them. Cc: stable <stable@kernel.org> Fixes: b9aa02c ("usb: typec: ucsi: Add polling mechanism for partner tasks like alt mode checking") Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Link: https://lore.kernel.org/r/20250305111739.1489003-2-akuchynski@chromium.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ff71218 commit b13abcb

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

drivers/usb/typec/ucsi/ucsi.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,11 +1825,11 @@ static int ucsi_init(struct ucsi *ucsi)
18251825

18261826
err_unregister:
18271827
for (con = connector; con->port; con++) {
1828+
if (con->wq)
1829+
destroy_workqueue(con->wq);
18281830
ucsi_unregister_partner(con);
18291831
ucsi_unregister_altmodes(con, UCSI_RECIPIENT_CON);
18301832
ucsi_unregister_port_psy(con);
1831-
if (con->wq)
1832-
destroy_workqueue(con->wq);
18331833

18341834
usb_power_delivery_unregister_capabilities(con->port_sink_caps);
18351835
con->port_sink_caps = NULL;
@@ -2013,10 +2013,6 @@ void ucsi_unregister(struct ucsi *ucsi)
20132013

20142014
for (i = 0; i < ucsi->cap.num_connectors; i++) {
20152015
cancel_work_sync(&ucsi->connector[i].work);
2016-
ucsi_unregister_partner(&ucsi->connector[i]);
2017-
ucsi_unregister_altmodes(&ucsi->connector[i],
2018-
UCSI_RECIPIENT_CON);
2019-
ucsi_unregister_port_psy(&ucsi->connector[i]);
20202016

20212017
if (ucsi->connector[i].wq) {
20222018
struct ucsi_work *uwork;
@@ -2032,6 +2028,11 @@ void ucsi_unregister(struct ucsi *ucsi)
20322028
destroy_workqueue(ucsi->connector[i].wq);
20332029
}
20342030

2031+
ucsi_unregister_partner(&ucsi->connector[i]);
2032+
ucsi_unregister_altmodes(&ucsi->connector[i],
2033+
UCSI_RECIPIENT_CON);
2034+
ucsi_unregister_port_psy(&ucsi->connector[i]);
2035+
20352036
usb_power_delivery_unregister_capabilities(ucsi->connector[i].port_sink_caps);
20362037
ucsi->connector[i].port_sink_caps = NULL;
20372038
usb_power_delivery_unregister_capabilities(ucsi->connector[i].port_source_caps);

0 commit comments

Comments
 (0)