genalloc improperly stores the sizes of freed chunks, allocates overlapping
memory regions, and oopses after its in-band data is overwritten.
Signed-off-by: Chris Humbert <mahadri-kernel@drigon.com>
Cc: Jes Sorensen <jes@trained-monkey.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
        if (size > max_chunk_size)
                return 0;
 
-       i = 0;
-
        size = max(size, 1 << ALLOC_MIN_SHIFT);
-       s = roundup_pow_of_two(size);
-
-       j = i;
+       i = fls(size - 1);
+       s = 1 << i;
+       j = i -= ALLOC_MIN_SHIFT;
 
        spin_lock_irqsave(&poolp->lock, flags);
        while (!h[j].next) {
        if (size > max_chunk_size)
                return;
 
-       i = 0;
-
        size = max(size, 1 << ALLOC_MIN_SHIFT);
-       s = roundup_pow_of_two(size);
+       i = fls(size - 1);
+       s = 1 << i;
+       i -= ALLOC_MIN_SHIFT;
 
        a = ptr;