On Mon, May 18, 2020 at 1:40 PM Alexander Gordeev <agordeev@xxxxxxxxxxxxx> wrote: > > Commit 2d6261583be0 ("lib: rework bitmap_parse()") does > not take into account order of halfwords on 64-bit big > endian architectures. Thanks for report and the patch! Did it work before? Can we have a test case for that that we will see the failure? > Fixes: 2d6261583be0 ("lib: rework bitmap_parse()") > Cc: stable@xxxxxxxxxxxxxxx > Cc: Yury Norov <yury.norov@xxxxxxxxx> > Cc: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Cc: Amritha Nambiar <amritha.nambiar@xxxxxxxxx> > Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Kees Cook <keescook@xxxxxxxxxxxx> > Cc: Matthew Wilcox <willy@xxxxxxxxxxxxx> > Cc: Miklos Szeredi <mszeredi@xxxxxxxxxx> > Cc: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> > Cc: Steffen Klassert <steffen.klassert@xxxxxxxxxxx> > Cc: "Tobin C . Harding" <tobin@xxxxxxxxxx> > Cc: Vineet Gupta <vineet.gupta1@xxxxxxxxxxxx> > Cc: Will Deacon <will.deacon@xxxxxxx> > Cc: Willem de Bruijn <willemb@xxxxxxxxxx> > Signed-off-by: Alexander Gordeev <agordeev@xxxxxxxxxxxxx> > --- > lib/bitmap.c | 20 ++++++++++++++++++-- > 1 file changed, 18 insertions(+), 2 deletions(-) > > diff --git a/lib/bitmap.c b/lib/bitmap.c > index 89260aa..a725e46 100644 > --- a/lib/bitmap.c > +++ b/lib/bitmap.c > @@ -717,6 +717,19 @@ static const char *bitmap_get_x32_reverse(const char *start, > return end; > } > > +#if defined(__BIG_ENDIAN) && defined(CONFIG_64BIT) > +static void save_x32_chunk(unsigned long *maskp, u32 chunk, int chunk_idx) > +{ > + maskp += (chunk_idx / 2); > + ((u32 *)maskp)[(chunk_idx & 1) ^ 1] = chunk; > +} > +#else > +static void save_x32_chunk(unsigned long *maskp, u32 chunk, int chunk_idx) > +{ > + ((u32 *)maskp)[chunk_idx] = chunk; > +} > +#endif > + > /** > * bitmap_parse - convert an ASCII hex string into a bitmap. > * @start: pointer to buffer containing string. > @@ -738,7 +751,8 @@ int bitmap_parse(const char *start, unsigned int buflen, > { > const char *end = strnchrnul(start, buflen, '\n') - 1; > int chunks = BITS_TO_U32(nmaskbits); > - u32 *bitmap = (u32 *)maskp; > + int chunk_idx = 0; > + u32 chunk; > int unset_bit; > > while (1) { > @@ -749,9 +763,11 @@ int bitmap_parse(const char *start, unsigned int buflen, > if (!chunks--) > return -EOVERFLOW; > > - end = bitmap_get_x32_reverse(start, end, bitmap++); > + end = bitmap_get_x32_reverse(start, end, &chunk); > if (IS_ERR(end)) > return PTR_ERR(end); > + > + save_x32_chunk(maskp, chunk, chunk_idx++); > } > > unset_bit = (BITS_TO_U32(nmaskbits) - chunks) * 32; > -- > 1.8.3.1 > -- With Best Regards, Andy Shevchenko