Once device_register() failed, we should call put_device() to decrement reference count for cleanup. Or it could cause memory leak.
device_register() includes device_add(). As comment of device_add() says, 'if device_add() succeeds, you should call device_del() when you want to get rid of it. If device_add() has not succeeded, use only put_device() to drop the reference count'.
Found by code review.
Cc: stable@vger.kernel.org Fixes: 37d6a0a6f470 ("PCI: Add pci_register_host_bridge() interface") Signed-off-by: Ma Ke make24@iscas.ac.cn --- drivers/pci/probe.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 2e81ab0f5a25..73464ffbb0fc 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -974,8 +974,10 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge) name = dev_name(&bus->dev);
err = device_register(&bus->dev); - if (err) + if (err) { + put_device(&bus->dev); goto unregister; + }
pcibios_add_bus(bus);
Once device_register() failed, we should call put_device() to decrement reference count for cleanup. Or it could cause memory leak.
device_register() includes device_add(). As comment of device_add()
…
I doubt that the information from the second description paragraph is helpful for this issue.
Found by code review.
Would you become interested to check how many similar control flows can still be detected by the means of automated advanced source code analyses?
Regards, Markus
linux-stable-mirror@lists.linaro.org