PCI/pwrctrl: Cancel outstanding rescan work when unregistering
authorBrian Norris <briannorris@google.com>
Wed, 9 Apr 2025 18:53:13 +0000 (11:53 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 23 May 2025 20:22:25 +0000 (15:22 -0500)
It's possible to trigger use-after-free here by:

  (a) forcing rescan_work_func() to take a long time and
  (b) utilizing a pwrctrl driver that may be unloaded for some reason

Cancel outstanding work to ensure it is finished before we allow our data
structures to be cleaned up.

[bhelgaas: tidy commit log]
Fixes: 8f62819aaace ("PCI/pwrctl: Rescan bus on a separate thread")
Signed-off-by: Brian Norris <briannorris@google.com>
Signed-off-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Krzysztof WilczyƄski <kwilczynski@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Cc: Konrad Dybcio <konradybcio@kernel.org>
Link: https://patch.msgid.link/20250409115313.1.Ia319526ed4ef06bec3180378c9a008340cec9658@changeid
drivers/pci/pwrctrl/core.c

index 9cc7e2b7f2b5608ee67c838b6500b2ae4a07ad52..6bdbfed584d6d79ce28ba9e384a596b065ca69a4 100644 (file)
@@ -101,6 +101,8 @@ EXPORT_SYMBOL_GPL(pci_pwrctrl_device_set_ready);
  */
 void pci_pwrctrl_device_unset_ready(struct pci_pwrctrl *pwrctrl)
 {
+       cancel_work_sync(&pwrctrl->work);
+
        /*
         * We don't have to delete the link here. Typically, this function
         * is only called when the power control device is being detached. If