Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit adeb2590 authored by Jiang Liu's avatar Jiang Liu Committed by David Woodhouse
Browse files

iommu/vt-d: fix memory leakage caused by commit ea8ea460



Commit ea8ea460 "iommu/vt-d: Clean up and fix page table clear/free
behaviour" introduces possible leakage of DMA page tables due to:
        for (pte = page_address(pg); !first_pte_in_page(pte); pte++) {
                if (dma_pte_present(pte) && !dma_pte_superpage(pte))
                        freelist = dma_pte_list_pagetables(domain, level - 1,
                                                           pte, freelist);
        }

For the first pte in a page, first_pte_in_page(pte) will always be true,
thus dma_pte_list_pagetables() will never be called and leak DMA page
tables if level is bigger than 1.

Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 7713ec06
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -1009,11 +1009,13 @@ static struct page *dma_pte_list_pagetables(struct dmar_domain *domain,
	if (level == 1)
		return freelist;

	for (pte = page_address(pg); !first_pte_in_page(pte); pte++) {
	pte = page_address(pg);
	do {
		if (dma_pte_present(pte) && !dma_pte_superpage(pte))
			freelist = dma_pte_list_pagetables(domain, level - 1,
							   pte, freelist);
	}
		pte++;
	} while (!first_pte_in_page(pte));

	return freelist;
}