params: Do not go over the limit when getting the string length
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 20 Nov 2023 15:11:43 +0000 (17:11 +0200)
committerKees Cook <keescook@chromium.org>
Fri, 1 Dec 2023 17:51:43 +0000 (09:51 -0800)
We can use strnlen() even on early stages and it prevents from
going over the string boundaries in case it's already too long.

Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20231120151419.1661807-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Kees Cook <keescook@chromium.org>
kernel/params.c

index 626fa82..f8e3c41 100644 (file)
@@ -260,7 +260,10 @@ EXPORT_SYMBOL_GPL(param_set_uint_minmax);
 
 int param_set_charp(const char *val, const struct kernel_param *kp)
 {
-       if (strlen(val) > 1024) {
+       size_t len, maxlen = 1024;
+
+       len = strnlen(val, maxlen + 1);
+       if (len == maxlen + 1) {
                pr_err("%s: string parameter too long\n", kp->name);
                return -ENOSPC;
        }
@@ -270,7 +273,7 @@ int param_set_charp(const char *val, const struct kernel_param *kp)
        /* This is a hack.  We can't kmalloc in early boot, and we
         * don't need to; this mangled commandline is preserved. */
        if (slab_is_available()) {
-               *(char **)kp->arg = kmalloc_parameter(strlen(val)+1);
+               *(char **)kp->arg = kmalloc_parameter(len + 1);
                if (!*(char **)kp->arg)
                        return -ENOMEM;
                strcpy(*(char **)kp->arg, val);
@@ -508,7 +511,7 @@ int param_set_copystring(const char *val, const struct kernel_param *kp)
 {
        const struct kparam_string *kps = kp->str;
 
-       if (strlen(val)+1 > kps->maxlen) {
+       if (strnlen(val, kps->maxlen) == kps->maxlen) {
                pr_err("%s: string doesn't fit in %u chars.\n",
                       kp->name, kps->maxlen-1);
                return -ENOSPC;