Messages in this thread Patch in this message | | | From | Yury Norov <> | Subject | [PATCH 1/5] lib: make bitmap_parselist_user() a wrapper on bitmap_parselist() | Date | Wed, 3 Apr 2019 07:45:36 +0300 |
| |
Currently we parse user data byte after byte which leads to overcomplification of parsing algorithm. The only user of bitmap_parselist_user() is not performance-critical, and so we can copy user data to kernel buffer and simply call bitmap_parselist(). This rework lets us unify and simplify bitmap_parselist() and bitmap_parselist_user(), which is done in the following patch.
Signed-off-by: Yury Norov <ynorov@marvell.com> --- lib/bitmap.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/lib/bitmap.c b/lib/bitmap.c index 98872e9025da..ce9ea804d06d 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -632,19 +632,30 @@ EXPORT_SYMBOL(bitmap_parselist); * @nmaskbits: size of bitmap, in bits. * * Wrapper for bitmap_parselist(), providing it with user buffer. - * - * We cannot have this as an inline function in bitmap.h because it needs - * linux/uaccess.h to get the access_ok() declaration and this causes - * cyclic dependencies. */ int bitmap_parselist_user(const char __user *ubuf, unsigned int ulen, unsigned long *maskp, int nmaskbits) { - if (!access_ok(ubuf, ulen)) - return -EFAULT; - return __bitmap_parselist((const char __force *)ubuf, - ulen, 1, maskp, nmaskbits); + char *buf; + int ret; + + buf = kmalloc(ulen + 1, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + buf[ulen] = 0; + + ret = copy_from_user(buf, ubuf, ulen); + if (ret) + goto out; + + ret = bitmap_parselist(buf, maskp, nmaskbits); + +out: + kfree(buf); + + return ret; } EXPORT_SYMBOL(bitmap_parselist_user); -- 2.17.1
| |