aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Roedel <jroedel@suse.de>2015-05-27 03:26:09 -0400
committerJoerg Roedel <jroedel@suse.de>2015-05-29 05:18:01 -0400
commite6aabee05f41c9d18e0b92194819edd84f352ac9 (patch)
treeafb4e60a376b680d810d4cd5668907eb3ed135c7
parentd4b036648402bb4ef6d4a0df51375a2fb705b6cc (diff)
iommu/amd: Handle integer overflow in dma_ops_area_alloc
Handle this case to make sure boundary_size does not become 0 and trigger a BUG_ON later. Signed-off-by: Joerg Roedel <jroedel@suse.de>
-rw-r--r--drivers/iommu/amd_iommu.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
index aa710b095f1a..4dfadcfed34a 100644
--- a/drivers/iommu/amd_iommu.c
+++ b/drivers/iommu/amd_iommu.c
@@ -1699,14 +1699,16 @@ static unsigned long dma_ops_area_alloc(struct device *dev,
1699 unsigned long next_bit = dom->next_address % APERTURE_RANGE_SIZE; 1699 unsigned long next_bit = dom->next_address % APERTURE_RANGE_SIZE;
1700 int max_index = dom->aperture_size >> APERTURE_RANGE_SHIFT; 1700 int max_index = dom->aperture_size >> APERTURE_RANGE_SHIFT;
1701 int i = start >> APERTURE_RANGE_SHIFT; 1701 int i = start >> APERTURE_RANGE_SHIFT;
1702 unsigned long boundary_size; 1702 unsigned long boundary_size, mask;
1703 unsigned long address = -1; 1703 unsigned long address = -1;
1704 unsigned long limit; 1704 unsigned long limit;
1705 1705
1706 next_bit >>= PAGE_SHIFT; 1706 next_bit >>= PAGE_SHIFT;
1707 1707
1708 boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, 1708 mask = dma_get_seg_boundary(dev);
1709 PAGE_SIZE) >> PAGE_SHIFT; 1709
1710 boundary_size = mask + 1 ? ALIGN(mask + 1, PAGE_SIZE) >> PAGE_SHIFT :
1711 1UL << (BITS_PER_LONG - PAGE_SHIFT);
1710 1712
1711 for (;i < max_index; ++i) { 1713 for (;i < max_index; ++i) {
1712 unsigned long offset = dom->aperture[i]->offset >> PAGE_SHIFT; 1714 unsigned long offset = dom->aperture[i]->offset >> PAGE_SHIFT;