lkml.org 
[lkml]   [2015]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 178/185] __bitmap_parselist: fix bug in empty string handling
    Date
    3.16.7-ckt15 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Chris Metcalf <cmetcalf@ezchip.com>

    commit 2528a8b8f457d7432552d0e2b6f0f4046bb702f4 upstream.

    bitmap_parselist("", &mask, nmaskbits) will erroneously set bit zero in
    the mask. The same bug is visible in cpumask_parselist() since it is
    layered on top of the bitmask code, e.g. if you boot with "isolcpus=",
    you will actually end up with cpu zero isolated.

    The bug was introduced in commit 4b060420a596 ("bitmap, irq: add
    smp_affinity_list interface to /proc/irq") when bitmap_parselist() was
    generalized to support userspace as well as kernelspace.

    Fixes: 4b060420a596 ("bitmap, irq: add smp_affinity_list interface to /proc/irq")
    Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com>
    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: Luis Henriques <luis.henriques@canonical.com>
    ---
    lib/bitmap.c | 17 +++++++++--------
    1 file changed, 9 insertions(+), 8 deletions(-)

    diff --git a/lib/bitmap.c b/lib/bitmap.c
    index e5c4ebe586ba..c0634aa923a6 100644
    --- a/lib/bitmap.c
    +++ b/lib/bitmap.c
    @@ -603,12 +603,12 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen,
    unsigned a, b;
    int c, old_c, totaldigits;
    const char __user __force *ubuf = (const char __user __force *)buf;
    - int exp_digit, in_range;
    + int at_start, in_range;

    totaldigits = c = 0;
    bitmap_zero(maskp, nmaskbits);
    do {
    - exp_digit = 1;
    + at_start = 1;
    in_range = 0;
    a = b = 0;

    @@ -637,11 +637,10 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen,
    break;

    if (c == '-') {
    - if (exp_digit || in_range)
    + if (at_start || in_range)
    return -EINVAL;
    b = 0;
    in_range = 1;
    - exp_digit = 1;
    continue;
    }

    @@ -651,16 +650,18 @@ static int __bitmap_parselist(const char *buf, unsigned int buflen,
    b = b * 10 + (c - '0');
    if (!in_range)
    a = b;
    - exp_digit = 0;
    + at_start = 0;
    totaldigits++;
    }
    if (!(a <= b))
    return -EINVAL;
    if (b >= nmaskbits)
    return -ERANGE;
    - while (a <= b) {
    - set_bit(a, maskp);
    - a++;
    + if (!at_start) {
    + while (a <= b) {
    + set_bit(a, maskp);
    + a++;
    + }
    }
    } while (buflen && c == ',');
    return 0;

    \
     
     \ /
      Last update: 2015-07-15 11:41    [W:2.814 / U:0.836 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site