From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Bhaumik Bhatt <bbhatt@codeaurora.org>,
Hemant Kumar <hemantk@codeaurora.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jeffrey Hugo <jhugo@codeaurora.org>,
Siddartha Mohanadoss <smohanad@codeaurora.org>,
Loic Poulain <loic.poulain@linaro.org>,
linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel-janitors@vger.kernel.org
Subject: Re: [PATCH] bus: mhi: core: Fix error handling in mhi_register_controller()
Date: Tue, 01 Dec 2020 13:49:48 +0000 [thread overview]
Message-ID: <20201201133748.GC9748@work> (raw)
In-Reply-To: <X8XqbtkPpEKSfFi2@mwanda>
On Tue, Dec 01, 2020 at 10:02:54AM +0300, Dan Carpenter wrote:
> There are a few problems with the error handling in this function. They
> mostly center around the alloc_ordered_workqueue() allocation.
> 1) If that allocation fails or if the kcalloc() prior to it fails then
> it leads to a NULL dereference when we call
> destroy_workqueue(mhi_cntrl->hiprio_wq).
> 2) The error code is not set.
> 3) The "mhi_cntrl->mhi_cmd" allocation is not freed.
>
> The error handling was slightly confusing and I re-ordered it to be in
> the exact mirror/reverse order of how things were allocated. I changed
> the label names to say what the goto does instead of describing where
> the goto comes from.
>
> Fixes: 8f7039787687 ("bus: mhi: core: Move to using high priority workqueue")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Applied to mhi-next!
Thanks,
Mani
> ---
> drivers/bus/mhi/core/init.c | 29 ++++++++++++++---------------
> 1 file changed, 14 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
> index 96cde9c0034c..f0697f433c2f 100644
> --- a/drivers/bus/mhi/core/init.c
> +++ b/drivers/bus/mhi/core/init.c
> @@ -871,7 +871,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> sizeof(*mhi_cntrl->mhi_cmd), GFP_KERNEL);
> if (!mhi_cntrl->mhi_cmd) {
> ret = -ENOMEM;
> - goto error_alloc_cmd;
> + goto err_free_event;
> }
>
> INIT_LIST_HEAD(&mhi_cntrl->transition_list);
> @@ -886,7 +886,8 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> ("mhi_hiprio_wq", WQ_MEM_RECLAIM | WQ_HIGHPRI);
> if (!mhi_cntrl->hiprio_wq) {
> dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate workqueue\n");
> - goto error_alloc_cmd;
> + ret = -ENOMEM;
> + goto err_free_cmd;
> }
>
> mhi_cmd = mhi_cntrl->mhi_cmd;
> @@ -932,7 +933,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs,
> SOC_HW_VERSION_OFFS, &soc_info);
> if (ret)
> - goto error_alloc_dev;
> + goto err_destroy_wq;
>
> mhi_cntrl->family_number = (soc_info & SOC_HW_VERSION_FAM_NUM_BMSK) >>
> SOC_HW_VERSION_FAM_NUM_SHFT;
> @@ -946,7 +947,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> mhi_cntrl->index = ida_alloc(&mhi_controller_ida, GFP_KERNEL);
> if (mhi_cntrl->index < 0) {
> ret = mhi_cntrl->index;
> - goto error_ida_alloc;
> + goto err_destroy_wq;
> }
>
> /* Register controller with MHI bus */
> @@ -954,7 +955,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> if (IS_ERR(mhi_dev)) {
> dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate MHI device\n");
> ret = PTR_ERR(mhi_dev);
> - goto error_alloc_dev;
> + goto err_ida_free;
> }
>
> mhi_dev->dev_type = MHI_DEVICE_CONTROLLER;
> @@ -967,7 +968,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
>
> ret = device_add(&mhi_dev->dev);
> if (ret)
> - goto error_add_dev;
> + goto err_release_dev;
>
> mhi_cntrl->mhi_dev = mhi_dev;
>
> @@ -975,19 +976,17 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
>
> return 0;
>
> -error_add_dev:
> +err_release_dev:
> put_device(&mhi_dev->dev);
> -
> -error_alloc_dev:
> +err_ida_free:
> ida_free(&mhi_controller_ida, mhi_cntrl->index);
> -
> -error_ida_alloc:
> +err_destroy_wq:
> + destroy_workqueue(mhi_cntrl->hiprio_wq);
> +err_free_cmd:
> kfree(mhi_cntrl->mhi_cmd);
> -
> -error_alloc_cmd:
> - vfree(mhi_cntrl->mhi_chan);
> +err_free_event:
> kfree(mhi_cntrl->mhi_event);
> - destroy_workqueue(mhi_cntrl->hiprio_wq);
> + vfree(mhi_cntrl->mhi_chan);
>
> return ret;
> }
> --
> 2.29.2
>
WARNING: multiple messages have this Message-ID (diff)
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Bhaumik Bhatt <bbhatt@codeaurora.org>,
Hemant Kumar <hemantk@codeaurora.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jeffrey Hugo <jhugo@codeaurora.org>,
Siddartha Mohanadoss <smohanad@codeaurora.org>,
Loic Poulain <loic.poulain@linaro.org>,
linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org,
kernel-janitors@vger.kernel.org
Subject: Re: [PATCH] bus: mhi: core: Fix error handling in mhi_register_controller()
Date: Tue, 1 Dec 2020 19:07:48 +0530 [thread overview]
Message-ID: <20201201133748.GC9748@work> (raw)
In-Reply-To: <X8XqbtkPpEKSfFi2@mwanda>
On Tue, Dec 01, 2020 at 10:02:54AM +0300, Dan Carpenter wrote:
> There are a few problems with the error handling in this function. They
> mostly center around the alloc_ordered_workqueue() allocation.
> 1) If that allocation fails or if the kcalloc() prior to it fails then
> it leads to a NULL dereference when we call
> destroy_workqueue(mhi_cntrl->hiprio_wq).
> 2) The error code is not set.
> 3) The "mhi_cntrl->mhi_cmd" allocation is not freed.
>
> The error handling was slightly confusing and I re-ordered it to be in
> the exact mirror/reverse order of how things were allocated. I changed
> the label names to say what the goto does instead of describing where
> the goto comes from.
>
> Fixes: 8f7039787687 ("bus: mhi: core: Move to using high priority workqueue")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Applied to mhi-next!
Thanks,
Mani
> ---
> drivers/bus/mhi/core/init.c | 29 ++++++++++++++---------------
> 1 file changed, 14 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
> index 96cde9c0034c..f0697f433c2f 100644
> --- a/drivers/bus/mhi/core/init.c
> +++ b/drivers/bus/mhi/core/init.c
> @@ -871,7 +871,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> sizeof(*mhi_cntrl->mhi_cmd), GFP_KERNEL);
> if (!mhi_cntrl->mhi_cmd) {
> ret = -ENOMEM;
> - goto error_alloc_cmd;
> + goto err_free_event;
> }
>
> INIT_LIST_HEAD(&mhi_cntrl->transition_list);
> @@ -886,7 +886,8 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> ("mhi_hiprio_wq", WQ_MEM_RECLAIM | WQ_HIGHPRI);
> if (!mhi_cntrl->hiprio_wq) {
> dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate workqueue\n");
> - goto error_alloc_cmd;
> + ret = -ENOMEM;
> + goto err_free_cmd;
> }
>
> mhi_cmd = mhi_cntrl->mhi_cmd;
> @@ -932,7 +933,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs,
> SOC_HW_VERSION_OFFS, &soc_info);
> if (ret)
> - goto error_alloc_dev;
> + goto err_destroy_wq;
>
> mhi_cntrl->family_number = (soc_info & SOC_HW_VERSION_FAM_NUM_BMSK) >>
> SOC_HW_VERSION_FAM_NUM_SHFT;
> @@ -946,7 +947,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> mhi_cntrl->index = ida_alloc(&mhi_controller_ida, GFP_KERNEL);
> if (mhi_cntrl->index < 0) {
> ret = mhi_cntrl->index;
> - goto error_ida_alloc;
> + goto err_destroy_wq;
> }
>
> /* Register controller with MHI bus */
> @@ -954,7 +955,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
> if (IS_ERR(mhi_dev)) {
> dev_err(mhi_cntrl->cntrl_dev, "Failed to allocate MHI device\n");
> ret = PTR_ERR(mhi_dev);
> - goto error_alloc_dev;
> + goto err_ida_free;
> }
>
> mhi_dev->dev_type = MHI_DEVICE_CONTROLLER;
> @@ -967,7 +968,7 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
>
> ret = device_add(&mhi_dev->dev);
> if (ret)
> - goto error_add_dev;
> + goto err_release_dev;
>
> mhi_cntrl->mhi_dev = mhi_dev;
>
> @@ -975,19 +976,17 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl,
>
> return 0;
>
> -error_add_dev:
> +err_release_dev:
> put_device(&mhi_dev->dev);
> -
> -error_alloc_dev:
> +err_ida_free:
> ida_free(&mhi_controller_ida, mhi_cntrl->index);
> -
> -error_ida_alloc:
> +err_destroy_wq:
> + destroy_workqueue(mhi_cntrl->hiprio_wq);
> +err_free_cmd:
> kfree(mhi_cntrl->mhi_cmd);
> -
> -error_alloc_cmd:
> - vfree(mhi_cntrl->mhi_chan);
> +err_free_event:
> kfree(mhi_cntrl->mhi_event);
> - destroy_workqueue(mhi_cntrl->hiprio_wq);
> + vfree(mhi_cntrl->mhi_chan);
>
> return ret;
> }
> --
> 2.29.2
>
next prev parent reply other threads:[~2020-12-01 13:49 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-01 7:02 [PATCH] bus: mhi: core: Fix error handling in mhi_register_controller() Dan Carpenter
2020-12-01 7:02 ` Dan Carpenter
2020-12-01 7:58 ` Loic Poulain
2020-12-01 7:58 ` Loic Poulain
2020-12-01 13:35 ` Manivannan Sadhasivam
2020-12-01 13:47 ` Manivannan Sadhasivam
2020-12-01 13:37 ` Manivannan Sadhasivam [this message]
2020-12-01 13:49 ` Manivannan Sadhasivam
2020-12-29 20:15 ` patchwork-bot+linux-arm-msm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201201133748.GC9748@work \
--to=manivannan.sadhasivam@linaro.org \
--cc=bbhatt@codeaurora.org \
--cc=dan.carpenter@oracle.com \
--cc=gregkh@linuxfoundation.org \
--cc=hemantk@codeaurora.org \
--cc=jhugo@codeaurora.org \
--cc=kernel-janitors@vger.kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=loic.poulain@linaro.org \
--cc=smohanad@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.