PCI/MSI: Fix memory leak in free_msi_irqs()
authorAlexei Starovoitov <ast@plumgrid.com>
Wed, 4 Jun 2014 22:49:50 +0000 (15:49 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 11 Jun 2014 17:13:19 +0000 (11:13 -0600)
free_msi_irqs() is leaking memory, since list_for_each_entry(entry,
&dev->msi_list, list) {...} is never executed, because dev->msi_list is
made empty by the loop just above this one.

Fix it by relying on zero termination of attribute array like
populate_msi_sysfs() does.

Fixes: 1c51b50c2995 ("PCI/MSI: Export MSI mode using attributes, not kobjects")
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
CC: stable@vger.kernel.org # v3.14+
drivers/pci/msi.c

index 27a7e67ddfe4c53617eea8c506fe96683a3d668d..229b0d13f08de159a2dd132ce182538ef818ba24 100644 (file)
@@ -413,7 +413,7 @@ static void free_msi_irqs(struct pci_dev *dev)
        if (dev->msi_irq_groups) {
                sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups);
                msi_attrs = dev->msi_irq_groups[0]->attrs;
-               list_for_each_entry(entry, &dev->msi_list, list) {
+               while (msi_attrs[count]) {
                        dev_attr = container_of(msi_attrs[count],
                                                struct device_attribute, attr);
                        kfree(dev_attr->attr.name);