dma-mapping: check pfn validity in dma_common_{mmap,get_sgtable}
Check that the pfn returned from arch_dma_coherent_to_pfn refers to a valid page and reject the mmap / get_sgtable requests otherwise. Based on the arm implementation of the mmap and get_sgtable methods. Signed-off-by: Christoph Hellwig <hch@lst.de> Tested-by: Vignesh Raghavendra <vigneshr@ti.com>
This commit is contained in:
parent
0653275001
commit
66d7780f18
|
@ -116,11 +116,16 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!dev_is_dma_coherent(dev)) {
|
if (!dev_is_dma_coherent(dev)) {
|
||||||
|
unsigned long pfn;
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN))
|
if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
page = pfn_to_page(arch_dma_coherent_to_pfn(dev, cpu_addr,
|
/* If the PFN is not valid, we do not have a struct page */
|
||||||
dma_addr));
|
pfn = arch_dma_coherent_to_pfn(dev, cpu_addr, dma_addr);
|
||||||
|
if (!pfn_valid(pfn))
|
||||||
|
return -ENXIO;
|
||||||
|
page = pfn_to_page(pfn);
|
||||||
} else {
|
} else {
|
||||||
page = virt_to_page(cpu_addr);
|
page = virt_to_page(cpu_addr);
|
||||||
}
|
}
|
||||||
|
@ -170,7 +175,11 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||||
if (!dev_is_dma_coherent(dev)) {
|
if (!dev_is_dma_coherent(dev)) {
|
||||||
if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN))
|
if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
|
/* If the PFN is not valid, we do not have a struct page */
|
||||||
pfn = arch_dma_coherent_to_pfn(dev, cpu_addr, dma_addr);
|
pfn = arch_dma_coherent_to_pfn(dev, cpu_addr, dma_addr);
|
||||||
|
if (!pfn_valid(pfn))
|
||||||
|
return -ENXIO;
|
||||||
} else {
|
} else {
|
||||||
pfn = page_to_pfn(virt_to_page(cpu_addr));
|
pfn = page_to_pfn(virt_to_page(cpu_addr));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue