Commit 3f046161 authored by Chao Gao's avatar Chao Gao Committed by Christoph Hellwig
Browse files

swiotlb: avoid potential left shift overflow



The second operand passed to slot_addr() is declared as int or unsigned int
in all call sites. The left-shift to get the offset of a slot can overflow
if swiotlb size is larger than 4G.

Convert the macro to an inline function and declare the second argument as
phys_addr_t to avoid the potential overflow.

Fixes: 26a7e094 ("swiotlb: refactor swiotlb_tbl_map_single")
Signed-off-by: default avatarChao Gao <chao.gao@intel.com>
Reviewed-by: default avatarDongli Zhang <dongli.zhang@oracle.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 2995b800
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -575,7 +575,10 @@ static void swiotlb_bounce(struct device *dev, phys_addr_t tlb_addr, size_t size
	}
}

#define slot_addr(start, idx)	((start) + ((idx) << IO_TLB_SHIFT))
static inline phys_addr_t slot_addr(phys_addr_t start, phys_addr_t idx)
{
	return start + (idx << IO_TLB_SHIFT);
}

/*
 * Carefully handle integer overflow which can occur when boundary_mask == ~0UL.