From: Dexuan Cui <decui@xxxxxxxxxxxxx> Sent: Friday, June 21, 2019 12:02 PM > > The commit 05f151a73ec2 itself is correct, but it exposes this > use-after-free bug, which is caught by some memory debug options. > > Add the Fixes tag to indicate the dependency. > > Fixes: 05f151a73ec2 ("PCI: hv: Fix a memory leak in hv_eject_device_work()") > Signed-off-by: Dexuan Cui <decui@xxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > --- > Sorry for not spotting the bug when sending 05f151a73ec2. > > Now I have enabled the mm debug options to help catch such mistakes in future. > > drivers/pci/controller/pci-hyperv.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c > index 808a182830e5..42ace1a690f9 100644 > --- a/drivers/pci/controller/pci-hyperv.c > +++ b/drivers/pci/controller/pci-hyperv.c > @@ -1880,6 +1880,7 @@ static void hv_pci_devices_present(struct hv_pcibus_device > *hbus, > static void hv_eject_device_work(struct work_struct *work) > { > struct pci_eject_response *ejct_pkt; > + struct hv_pcibus_device *hbus; > struct hv_pci_dev *hpdev; > struct pci_dev *pdev; > unsigned long flags; > @@ -1890,6 +1891,7 @@ static void hv_eject_device_work(struct work_struct *work) > } ctxt; > > hpdev = container_of(work, struct hv_pci_dev, wrk); > + hbus = hpdev->hbus; In the lines of code following this new assignment, there are four uses of hpdev->hbus besides the one at the bottom of the function that causes the use-after-free error. With 'hbus' now available as a local variable, it looks rather strange to have those other places still using hpdev->hbus. I'm thinking they should be shortened to just 'hbus' for consistency, even though such changes aren't directly related to fixing the bug. Michael > > WARN_ON(hpdev->state != hv_pcichild_ejecting); > > @@ -1929,7 +1931,9 @@ static void hv_eject_device_work(struct work_struct *work) > /* For the two refs got in new_pcichild_device() */ > put_pcichild(hpdev); > put_pcichild(hpdev); > - put_hvpcibus(hpdev->hbus); > + /* hpdev has been freed. Do not use it any more. */ > + > + put_hvpcibus(hbus); > } > > /** > -- > 2.17.1