mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-11 07:04:04 +08:00
iommu/vt-d: fix memory leakage caused by commit ea8ea46
Commit ea8ea46
"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: Jiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
7713ec066a
commit
adeb25905c
@ -1009,11 +1009,13 @@ static struct page *dma_pte_list_pagetables(struct dmar_domain *domain,
|
|||||||
if (level == 1)
|
if (level == 1)
|
||||||
return freelist;
|
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))
|
if (dma_pte_present(pte) && !dma_pte_superpage(pte))
|
||||||
freelist = dma_pte_list_pagetables(domain, level - 1,
|
freelist = dma_pte_list_pagetables(domain, level - 1,
|
||||||
pte, freelist);
|
pte, freelist);
|
||||||
}
|
pte++;
|
||||||
|
} while (!first_pte_in_page(pte));
|
||||||
|
|
||||||
return freelist;
|
return freelist;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user