Messages in this thread | | | Date | Mon, 29 Jun 2015 16:39:01 +0300 | Subject | Re: [PATCH] lib/bitmap.c: return -EINVAL for grouping errors in __bitmap_parselist | From | Yury Norov <> |
| |
> Sometimes the input from user may cause an unexpected result.
Could you please provide specific example?
> > just like __bitmap_parse, we return -EINVAL if there is no avaiable digit in each > parsing procedures. > > Signed-off-by: Pan Xinhui <xinhuix.pan@intel.com>
Hello, Pan.
(Adding Alexey Klimov, Rasmus Villemoes)
> --- > lib/bitmap.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/lib/bitmap.c b/lib/bitmap.c > index 64c0926..995fca2 100644 > --- a/lib/bitmap.c > +++ b/lib/bitmap.c > @@ -504,7 +504,7 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, > int nmaskbits) > { > unsigned a, b; > - int c, old_c, totaldigits; > + int c, old_c, totaldigits, ndigits; > const char __user __force *ubuf = (const char __user __force *)buf; > int exp_digit, in_range; > > @@ -514,6 +514,7 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, > exp_digit = 1; > in_range = 0; > a = b = 0; > + ndigits = 0; > > /* Get the next cpu# or a range of cpu#'s */ > while (buflen) { > @@ -555,8 +556,10 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen, > if (!in_range) > a = b; > exp_digit = 0; > - totaldigits++; > + ndigits++; totaldigits++;
I'm not happy with joining two statements to a single line. Maybe sometimes it's OK for loop iterators like
while (a[i][j]) { i++; j++; }
But here it looks nasty. Anyway, it's minor.
> } > + if (ndigits == 0) > + return -EINVAL;
You can avoid in-loop incrementation of ndigits if you'll save current totaldigits to ndigits before loop, and check ndigits against totaldigits after the loop:
ndigits = totaldigits; while (...) { ... totaldigits++; }
if (ndigits == totaldigits) return -EINVAL;
Maybe it's a good point to rework initial __bitmap_parse() similar way...
> if (!(a <= b)) > return -EINVAL; > if (b >= nmaskbits) > -- > 1.9.1
| |