Intel-IOMMU Alignment Issue in dma_pte_clear_range()
authorFenghua Yu <fenghua.yu@intel.com>
Mon, 6 Apr 2009 18:21:49 +0000 (11:21 -0700)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Mon, 6 Apr 2009 21:47:00 +0000 (14:47 -0700)
This issue was pointed out by Linus.

In dma_pte_clear_range() in intel-iommu.c

start = PAGE_ALIGN(start);
end &= PAGE_MASK;
npages = (end - start) / VTD_PAGE_SIZE;

In partial page case, start could be bigger than end and npages will be
negative.

Currently the issue doesn't show up as a real bug in because start and
end have been aligned to page boundary already by all callers. So the
issue has been hidden. But it is dangerous programming practice.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/pci/intel-iommu.c

index dcda5212f3bb9b2540ff04bc6b8ef8e1a8e4f0f5..f0dade1c587b44f33311bbbe18c416e64e7c4516 100644 (file)
@@ -733,8 +733,8 @@ static void dma_pte_clear_range(struct dmar_domain *domain, u64 start, u64 end)
        start &= (((u64)1) << addr_width) - 1;
        end &= (((u64)1) << addr_width) - 1;
        /* in case it's partial page */
-       start = PAGE_ALIGN(start);
-       end &= PAGE_MASK;
+       start &= PAGE_MASK;
+       end = PAGE_ALIGN(end);
        npages = (end - start) / VTD_PAGE_SIZE;
 
        /* we don't need lock here, nobody else touches the iova range */