bus: mhi: core: Validate channel ID when processing command completions
Subsystems (2)
PATCH 1/1 bus: mhi: core: Validate channel ID when processing command completions
MHI reads the channel ID from the event ring element sent by the device which can be any value between 0 and 255. In order to prevent any out of bound accesses, add a check against the maximum number of channels supported by the controller and those channels not configured yet so as to skip processing of that event ring element.
--- drivers/bus/mhi/core/main.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/bus/mhi/core/main.c +12 -5
@@ -773,11 +773,18 @@ static void mhi_process_cmd_completion(struct mhi_controller *mhi_cntrl, cmd_pkt =mhi_to_virtual (mhi_ring, ptr); chan =MHI_TRE_GET_CMD_CHID (cmd_pkt); - mhi_chan = &mhi_cntrl->mhi_chan[chan]; -write_lock_bh (&mhi_chan->lock); - mhi_chan->ccs =MHI_TRE_GET_EV_CODE (tre); -complete (&mhi_chan->completion); -write_unlock_bh (&mhi_chan->lock); + +if (chan < mhi_cntrl->max_chan && + mhi_cntrl->mhi_chan[chan].configured) { + mhi_chan = &mhi_cntrl->mhi_chan[chan]; +write_lock_bh (&mhi_chan->lock); + mhi_chan->ccs =MHI_TRE_GET_EV_CODE (tre); +complete (&mhi_chan->completion); +write_unlock_bh (&mhi_chan->lock); + }else { +dev_err (&mhi_cntrl->mhi_dev->dev, +"Completion packet for invalid channel ID: %d\n" , chan); + }mhi_del_ring_element (mhi_cntrl, mhi_ring); }
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Quoted 7 lines · Bhaumik Bhatt
MHI reads the channel ID from the event ring element sent by the device which can be any value between 0 and 255. In order to prevent any out of bound accesses, add a check against the maximum number of channels supported by the controller and those channels not configured yet so as to skip processing of that event ring element.
Quoted 6 lines
Fixes 1d3173a3bae7 ("bus: mhi: core: Add support for processing events from client device")Signed-off-by Bhaumik Bhatt <[email protected]>Reviewed-by Hemant Kumar <[email protected]>Reviewed-by Manivannan Sadhasivam <[email protected]>Reviewed-by Jeffrey Hugo <[email protected]>
Removed "Link" and applied to mhi-next!
Thanks,
Mani
Quoted 36 lines
--- drivers/bus/mhi/core/main.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)drivers/bus/mhi/core/main.c +12
-5@@ -773,11 +773,18 @@ static void mhi_process_cmd_completion(struct mhi_controller *mhi_cntrl, cmd_pkt =mhi_to_virtual (mhi_ring, ptr); chan =MHI_TRE_GET_CMD_CHID (cmd_pkt); - mhi_chan = &mhi_cntrl->mhi_chan[chan]; -write_lock_bh (&mhi_chan->lock); - mhi_chan->ccs =MHI_TRE_GET_EV_CODE (tre); -complete (&mhi_chan->completion); -write_unlock_bh (&mhi_chan->lock); + +if (chan < mhi_cntrl->max_chan && + mhi_cntrl->mhi_chan[chan].configured) { + mhi_chan = &mhi_cntrl->mhi_chan[chan]; +write_lock_bh (&mhi_chan->lock); + mhi_chan->ccs =MHI_TRE_GET_EV_CODE (tre); +complete (&mhi_chan->completion); +write_unlock_bh (&mhi_chan->lock); + }else { +dev_err (&mhi_cntrl->mhi_dev->dev, +"Completion packet for invalid channel ID: %d\n" , chan); + }mhi_del_ring_element (mhi_cntrl, mhi_ring); }Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project