| From ea5d05b34aca25c066e0699512d0ffbd8ee6ac3e Mon Sep 17 00:00:00 2001 |
| From: Jan Kara <jack@suse.cz> |
| Date: Wed, 29 Oct 2014 14:50:44 -0700 |
| Subject: lib/bitmap.c: fix undefined shift in __bitmap_shift_{left|right}() |
| |
| From: Jan Kara <jack@suse.cz> |
| |
| commit ea5d05b34aca25c066e0699512d0ffbd8ee6ac3e upstream. |
| |
| If __bitmap_shift_left() or __bitmap_shift_right() are asked to shift by |
| a multiple of BITS_PER_LONG, they will try to shift a long value by |
| BITS_PER_LONG bits which is undefined. Change the functions to avoid |
| the undefined shift. |
| |
| Coverity id: 1192175 |
| Coverity id: 1192174 |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| lib/bitmap.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/lib/bitmap.c |
| +++ b/lib/bitmap.c |
| @@ -131,7 +131,9 @@ void __bitmap_shift_right(unsigned long |
| lower = src[off + k]; |
| if (left && off + k == lim - 1) |
| lower &= mask; |
| - dst[k] = upper << (BITS_PER_LONG - rem) | lower >> rem; |
| + dst[k] = lower >> rem; |
| + if (rem) |
| + dst[k] |= upper << (BITS_PER_LONG - rem); |
| if (left && k == lim - 1) |
| dst[k] &= mask; |
| } |
| @@ -172,7 +174,9 @@ void __bitmap_shift_left(unsigned long * |
| upper = src[k]; |
| if (left && k == lim - 1) |
| upper &= (1UL << left) - 1; |
| - dst[k + off] = lower >> (BITS_PER_LONG - rem) | upper << rem; |
| + dst[k + off] = upper << rem; |
| + if (rem) |
| + dst[k + off] |= lower >> (BITS_PER_LONG - rem); |
| if (left && k + off == lim - 1) |
| dst[k + off] &= (1UL << left) - 1; |
| } |