Commit aa8e4fc6 authored by Linus Torvalds's avatar Linus Torvalds

bitmap: fix end condition in bitmap_find_free_region

Guennadi Liakhovetski noticed that the end condition for the loop in
bitmap_find_free_region() is wrong, and the "return if error" was also
using the wrong conditional that would only trigger if the bitmap was an
exact multiple of the allocation size, which is not necessarily the case
with dma_alloc_from_coherent().

Such a failure would end up in bitmap_find_free_region() accessing
beyond the end of the bitmap.
Reported-by: default avatarGuennadi Liakhovetski <lg@denx.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9ead6497
...@@ -948,15 +948,15 @@ static int __reg_op(unsigned long *bitmap, int pos, int order, int reg_op) ...@@ -948,15 +948,15 @@ static int __reg_op(unsigned long *bitmap, int pos, int order, int reg_op)
*/ */
int bitmap_find_free_region(unsigned long *bitmap, int bits, int order) int bitmap_find_free_region(unsigned long *bitmap, int bits, int order)
{ {
int pos; /* scans bitmap by regions of size order */ int pos, end; /* scans bitmap by regions of size order */
for (pos = 0; pos < bits; pos += (1 << order)) for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) {
if (__reg_op(bitmap, pos, order, REG_OP_ISFREE)) if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE))
break; continue;
if (pos == bits) __reg_op(bitmap, pos, order, REG_OP_ALLOC);
return -ENOMEM; return pos;
__reg_op(bitmap, pos, order, REG_OP_ALLOC); }
return pos; return -ENOMEM;
} }
EXPORT_SYMBOL(bitmap_find_free_region); EXPORT_SYMBOL(bitmap_find_free_region);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment