When pse_controller_register() fails after it allocated the notification kfifo, it returns without freeing it. Free the kfifo on every error path. Found by code inspection and AI review. Fixes: ffef61d6d273 ("net: pse-pd: Add support for budget evaluation strategies") Reviewed-by: Kory Maincent Signed-off-by: Carlo Szelinsky --- drivers/net/pse-pd/pse_core.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/net/pse-pd/pse_core.c b/drivers/net/pse-pd/pse_core.c index c13bbf126a9f..f5a44e17cbec 100644 --- a/drivers/net/pse-pd/pse_core.c +++ b/drivers/net/pse-pd/pse_core.c @@ -1120,24 +1120,25 @@ int pse_controller_register(struct pse_controller_dev *pcdev) !pcdev->ops->pi_get_pw_status) { dev_err(pcdev->dev, "Mandatory status report callbacks are missing"); - return -EINVAL; + ret = -EINVAL; + goto free_kfifo; } ret = of_load_pse_pis(pcdev); if (ret) - return ret; + goto free_kfifo; /* The PI regulator ops use pcdev->pi until devres unregisters the * regulators, so free it from devres too, after them. */ ret = devm_add_action_or_reset(pcdev->dev, devm_pse_release_pis, pcdev); if (ret) - return ret; + goto free_kfifo; if (pcdev->ops->setup_pi_matrix) { ret = pcdev->ops->setup_pi_matrix(pcdev); if (ret) - return ret; + goto free_kfifo; } /* Each regulator name len is pcdev dev name + 7 char + @@ -1154,26 +1155,33 @@ int pse_controller_register(struct pse_controller_dev *pcdev) continue; reg_name = devm_kzalloc(pcdev->dev, reg_name_len, GFP_KERNEL); - if (!reg_name) - return -ENOMEM; + if (!reg_name) { + ret = -ENOMEM; + goto free_kfifo; + } snprintf(reg_name, reg_name_len, "pse-%s_pi%d", dev_name(pcdev->dev), i); ret = devm_pse_pi_regulator_register(pcdev, reg_name, i); if (ret) - return ret; + goto free_kfifo; } ret = pse_register_pw_ds(pcdev); if (ret) - return ret; + goto free_kfifo; mutex_lock(&pse_list_mutex); list_add(&pcdev->list, &pse_controller_list); mutex_unlock(&pse_list_mutex); return 0; + +free_kfifo: + cancel_work_sync(&pcdev->ntf_work); + kfifo_free(&pcdev->ntf_fifo); + return ret; } EXPORT_SYMBOL_GPL(pse_controller_register); -- 2.43.0