[PATCH] usb: typec: ucsi: Release the connector array if ucsi_init() fails

From: Heikki Krogerus
Date: Wed Jan 25 2023 - 03:16:28 EST


Interim.

If ucsi_init() fails, leaving ucsi->connector with value
NULL. The array that the pointer contains is also freed at
the same time.

This is a test fix for:
https://bugzilla.kernel.org/show_bug.cgi?id=216697

Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx>
---
drivers/usb/typec/ucsi/ucsi.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
index 308498e871dfb..be517efc403af 100644
--- a/drivers/usb/typec/ucsi/ucsi.c
+++ b/drivers/usb/typec/ucsi/ucsi.c
@@ -1400,6 +1400,9 @@ static int ucsi_init(struct ucsi *ucsi)
con->port = NULL;
}

+ kfree(ucsi->connector);
+ ucsi->connector = NULL;
+
err_reset:
memset(&ucsi->cap, 0, sizeof(ucsi->cap));
ucsi_reset_ppm(ucsi);
@@ -1431,7 +1434,8 @@ static void ucsi_resume_work(struct work_struct *work)

int ucsi_resume(struct ucsi *ucsi)
{
- queue_work(system_long_wq, &ucsi->resume_work);
+ if (ucsi->connector)
+ queue_work(system_long_wq, &ucsi->resume_work);
return 0;
}
EXPORT_SYMBOL_GPL(ucsi_resume);
@@ -1551,6 +1555,9 @@ void ucsi_unregister(struct ucsi *ucsi)
/* Disable notifications */
ucsi->ops->async_write(ucsi, UCSI_CONTROL, &cmd, sizeof(cmd));

+ if (!ucsi->connector)
+ return;
+
for (i = 0; i < ucsi->cap.num_connectors; i++) {
cancel_work_sync(&ucsi->connector[i].work);
ucsi_unregister_partner(&ucsi->connector[i]);
--
2.39.0


--XeOJB41DODR5ewEl--