| From a1f660ef6c854d565f660ce8c1abd53f525565c3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 27 May 2020 21:13:22 -0500 |
| Subject: PCI: Fix pci_create_slot() reference count leak |
| |
| From: Qiushi Wu <wu000273@umn.edu> |
| |
| [ Upstream commit 8a94644b440eef5a7b9c104ac8aa7a7f413e35e5 ] |
| |
| kobject_init_and_add() takes a reference even when it fails. If it returns |
| an error, kobject_put() must be called to clean up the memory associated |
| with the object. |
| |
| When kobject_init_and_add() fails, call kobject_put() instead of kfree(). |
| |
| b8eb718348b8 ("net-sysfs: Fix reference count leak in |
| rx|netdev_queue_add_kobject") fixed a similar problem. |
| |
| Link: https://lore.kernel.org/r/20200528021322.1984-1-wu000273@umn.edu |
| Signed-off-by: Qiushi Wu <wu000273@umn.edu> |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pci/slot.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c |
| index 429d34c348b9f..01a343ad7155c 100644 |
| --- a/drivers/pci/slot.c |
| +++ b/drivers/pci/slot.c |
| @@ -303,13 +303,16 @@ placeholder: |
| slot_name = make_slot_name(name); |
| if (!slot_name) { |
| err = -ENOMEM; |
| + kfree(slot); |
| goto err; |
| } |
| |
| err = kobject_init_and_add(&slot->kobj, &pci_slot_ktype, NULL, |
| "%s", slot_name); |
| - if (err) |
| + if (err) { |
| + kobject_put(&slot->kobj); |
| goto err; |
| + } |
| |
| INIT_LIST_HEAD(&slot->list); |
| list_add(&slot->list, &parent->slots); |
| @@ -328,7 +331,6 @@ out: |
| mutex_unlock(&pci_slot_mutex); |
| return slot; |
| err: |
| - kfree(slot); |
| slot = ERR_PTR(err); |
| goto out; |
| } |
| -- |
| 2.25.1 |
| |