mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 06:14:39 +01:00
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 <[email protected]>
Fixes: b9aa02ca39 ("usb: typec: ucsi: Add polling mechanism for partner tasks like alt mode checking")
Signed-off-by: Andrei Kuchynski <[email protected]>
Reviewed-by: Heikki Krogerus <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
1 parent
ff712188da
commit
b13abcb7dd
1 file changed
+7
-6
@@ -1825,11 +1825,11 @@ static int ucsi_init(struct ucsi *ucsi)
|
||||
|
||||
err_unregister:
|
||||
for (con = connector; con->port; con++) {
|
||||
if (con->wq)
|
||||
destroy_workqueue(con->wq);
|
||||
ucsi_unregister_partner(con);
|
||||
ucsi_unregister_altmodes(con, UCSI_RECIPIENT_CON);
|
||||
ucsi_unregister_port_psy(con);
|
||||
if (con->wq)
|
||||
destroy_workqueue(con->wq);
|
||||
|
||||
usb_power_delivery_unregister_capabilities(con->port_sink_caps);
|
||||
con->port_sink_caps = NULL;
|
||||
@@ -2013,10 +2013,6 @@ void ucsi_unregister(struct ucsi *ucsi)
|
||||
|
||||
for (i = 0; i < ucsi->cap.num_connectors; i++) {
|
||||
cancel_work_sync(&ucsi->connector[i].work);
|
||||
ucsi_unregister_partner(&ucsi->connector[i]);
|
||||
ucsi_unregister_altmodes(&ucsi->connector[i],
|
||||
UCSI_RECIPIENT_CON);
|
||||
ucsi_unregister_port_psy(&ucsi->connector[i]);
|
||||
|
||||
if (ucsi->connector[i].wq) {
|
||||
struct ucsi_work *uwork;
|
||||
@@ -2032,6 +2028,11 @@ void ucsi_unregister(struct ucsi *ucsi)
|
||||
destroy_workqueue(ucsi->connector[i].wq);
|
||||
}
|
||||
|
||||
ucsi_unregister_partner(&ucsi->connector[i]);
|
||||
ucsi_unregister_altmodes(&ucsi->connector[i],
|
||||
UCSI_RECIPIENT_CON);
|
||||
ucsi_unregister_port_psy(&ucsi->connector[i]);
|
||||
|
||||
usb_power_delivery_unregister_capabilities(ucsi->connector[i].port_sink_caps);
|
||||
ucsi->connector[i].port_sink_caps = NULL;
|
||||
usb_power_delivery_unregister_capabilities(ucsi->connector[i].port_source_caps);
|
||||
|
||||
Reference in new issue
Block a user