diff options
author | Joerg Roedel <jroedel@suse.de> | 2015-05-27 03:26:09 -0400 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2015-05-29 05:18:01 -0400 |
commit | e6aabee05f41c9d18e0b92194819edd84f352ac9 (patch) | |
tree | afb4e60a376b680d810d4cd5668907eb3ed135c7 | |
parent | d4b036648402bb4ef6d4a0df51375a2fb705b6cc (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.c | 8 |
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; |