From 58b54a11270d385dfbb039d1e3f91fef0e9ad783 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Sun, 15 Jun 2014 23:14:38 +0000 Subject: [PATCH] PCI/MSI: Fix memory leak in free_msi_irqs() (regression in 3.14) svn path=/dists/sid/linux/; revision=21442 --- debian/changelog | 1 + ...MSI-Fix-memory-leak-in-free_msi_irqs.patch | 33 +++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 35 insertions(+) create mode 100644 debian/patches/bugfix/all/PCI-MSI-Fix-memory-leak-in-free_msi_irqs.patch diff --git a/debian/changelog b/debian/changelog index 2f4410cee..909c062ff 100644 --- a/debian/changelog +++ b/debian/changelog @@ -229,6 +229,7 @@ linux (3.14.7-1) UNRELEASED; urgency=medium * fs,userns: Change inode_capable to capable_wrt_inode_uidgid (CVE-2014-4014) * SCSI: Fix spurious request sense in error handling (regression in 3.14) + * PCI/MSI: Fix memory leak in free_msi_irqs() (regression in 3.14) -- Ian Campbell Fri, 06 Jun 2014 18:18:41 +0100 diff --git a/debian/patches/bugfix/all/PCI-MSI-Fix-memory-leak-in-free_msi_irqs.patch b/debian/patches/bugfix/all/PCI-MSI-Fix-memory-leak-in-free_msi_irqs.patch new file mode 100644 index 000000000..c3a90d88b --- /dev/null +++ b/debian/patches/bugfix/all/PCI-MSI-Fix-memory-leak-in-free_msi_irqs.patch @@ -0,0 +1,33 @@ +From: Alexei Starovoitov +Date: Wed, 4 Jun 2014 15:49:50 -0700 +Subject: PCI/MSI: Fix memory leak in free_msi_irqs() +Origin: https://git.kernel.org/linus/b701c0b1fe819a2083fc6ec5332e0e4492b9516d + +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 +Signed-off-by: Bjorn Helgaas +Acked-by: Neil Horman +Acked-by: Greg Kroah-Hartman +CC: stable@vger.kernel.org # v3.14+ +--- + drivers/pci/msi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/pci/msi.c ++++ b/drivers/pci/msi.c +@@ -414,7 +414,7 @@ static void free_msi_irqs(struct pci_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); diff --git a/debian/patches/series b/debian/patches/series index 414f924b6..d79966a3c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -96,3 +96,4 @@ debian/dma-avoid-abi-change-in-3.14.6.patch bugfix/all/fs-userns-change-inode_capable-to-capable_wrt_inode_uidgid.patch debian/vfs-avoid-abi-change-for-cve-2014-4014.patch bugfix/all/SCSI-Fix-spurious-request-sense-in-error-handling.patch +bugfix/all/PCI-MSI-Fix-memory-leak-in-free_msi_irqs.patch