From e36bc64339e1002730292be6321748ba7ef93e0d Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 5 Sep 2022 12:58:36 -0400 Subject: [PATCH] Fixes for 5.4 Signed-off-by: Sasha Levin --- queue-5.4/series | 1 + ...x-use-after-free-on-runtime-pm-wakeu.patch | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 queue-5.4/usb-dwc3-qcom-fix-use-after-free-on-runtime-pm-wakeu.patch diff --git a/queue-5.4/series b/queue-5.4/series index 61c939b94ae..bf86ebcdc25 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -23,3 +23,4 @@ misc-fastrpc-fix-memory-corruption-on-probe.patch misc-fastrpc-fix-memory-corruption-on-open.patch usb-serial-ftdi_sio-add-omron-cs1w-cif31-device-id.patch binder-fix-uaf-of-ref-proc-caused-by-race-condition.patch +usb-dwc3-qcom-fix-use-after-free-on-runtime-pm-wakeu.patch diff --git a/queue-5.4/usb-dwc3-qcom-fix-use-after-free-on-runtime-pm-wakeu.patch b/queue-5.4/usb-dwc3-qcom-fix-use-after-free-on-runtime-pm-wakeu.patch new file mode 100644 index 00000000000..9be694048e4 --- /dev/null +++ b/queue-5.4/usb-dwc3-qcom-fix-use-after-free-on-runtime-pm-wakeu.patch @@ -0,0 +1,82 @@ +From 820305c9bb77fc7677bcf86421e65ac85cfd683e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Aug 2022 17:09:56 +0200 +Subject: usb: dwc3: qcom: fix use-after-free on runtime-PM wakeup + +From: Johan Hovold + +[ Upstream commit a872ab303d5ddd4c965f9cd868677781a33ce35a ] + +The Qualcomm dwc3 runtime-PM implementation checks the xhci +platform-device pointer in the wakeup-interrupt handler to determine +whether the controller is in host mode and if so triggers a resume. + +After a role switch in OTG mode the xhci platform-device would have been +freed and the next wakeup from runtime suspend would access the freed +memory. + +Note that role switching is executed from a freezable workqueue, which +guarantees that the pointer is stable during suspend. + +Also note that runtime PM has been broken since commit 2664deb09306 +("usb: dwc3: qcom: Honor wakeup enabled/disabled state"), which +incidentally also prevents this issue from being triggered. + +Fixes: a4333c3a6ba9 ("usb: dwc3: Add Qualcomm DWC3 glue driver") +Cc: stable@vger.kernel.org # 4.18 +Reviewed-by: Matthias Kaehlcke +Reviewed-by: Manivannan Sadhasivam +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20220804151001.23612-5-johan+linaro@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc3/dwc3-qcom.c | 14 +++++++++++++- + drivers/usb/dwc3/host.c | 1 + + 2 files changed, 14 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c +index 7874b97e33227..aed35276e0e0c 100644 +--- a/drivers/usb/dwc3/dwc3-qcom.c ++++ b/drivers/usb/dwc3/dwc3-qcom.c +@@ -190,6 +190,14 @@ static int dwc3_qcom_register_extcon(struct dwc3_qcom *qcom) + return 0; + } + ++/* Only usable in contexts where the role can not change. */ ++static bool dwc3_qcom_is_host(struct dwc3_qcom *qcom) ++{ ++ struct dwc3 *dwc = platform_get_drvdata(qcom->dwc3); ++ ++ return dwc->xhci; ++} ++ + static void dwc3_qcom_disable_interrupts(struct dwc3_qcom *qcom) + { + if (qcom->hs_phy_irq) { +@@ -297,7 +305,11 @@ static irqreturn_t qcom_dwc3_resume_irq(int irq, void *data) + if (qcom->pm_suspended) + return IRQ_HANDLED; + +- if (dwc->xhci) ++ /* ++ * This is safe as role switching is done from a freezable workqueue ++ * and the wakeup interrupts are disabled as part of resume. ++ */ ++ if (dwc3_qcom_is_host(qcom)) + pm_runtime_resume(&dwc->xhci->dev); + + return IRQ_HANDLED; +diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c +index fa252870c926f..38bcb079ffc74 100644 +--- a/drivers/usb/dwc3/host.c ++++ b/drivers/usb/dwc3/host.c +@@ -128,4 +128,5 @@ int dwc3_host_init(struct dwc3 *dwc) + void dwc3_host_exit(struct dwc3 *dwc) + { + platform_device_unregister(dwc->xhci); ++ dwc->xhci = NULL; + } +-- +2.35.1 + -- 2.47.3