Merge tag 'pull-rename' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / kernel / params.c
index 2d4a056..2e447f8 100644 (file)
@@ -1,19 +1,20 @@
 // SPDX-License-Identifier: GPL-2.0-or-later
-/* Helpers for initial module or kernel cmdline parsing
-   Copyright (C) 2001 Rusty Russell.
-
-*/
+/*
+ * Helpers for initial module or kernel cmdline parsing
+ * Copyright (C) 2001 Rusty Russell.
+ */
+#include <linux/ctype.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/kstrtox.h>
-#include <linux/string.h>
-#include <linux/errno.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/device.h>
-#include <linux/err.h>
-#include <linux/slab.h>
-#include <linux/ctype.h>
+#include <linux/overflow.h>
 #include <linux/security.h>
+#include <linux/slab.h>
+#include <linux/string.h>
 
 #ifdef CONFIG_SYSFS
 /* Protects all built-in parameters, modules use their own param_lock */
@@ -48,7 +49,7 @@ static void *kmalloc_parameter(unsigned int size)
 {
        struct kmalloced_param *p;
 
-       p = kmalloc(sizeof(*p) + size, GFP_KERNEL);
+       p = kmalloc(size_add(sizeof(*p), size), GFP_KERNEL);
        if (!p)
                return NULL;
 
@@ -120,9 +121,7 @@ static int parse_one(char *param,
                     unsigned num_params,
                     s16 min_level,
                     s16 max_level,
-                    void *arg,
-                    int (*handle_unknown)(char *param, char *val,
-                                    const char *doing, void *arg))
+                    void *arg, parse_unknown_fn handle_unknown)
 {
        unsigned int i;
        int err;
@@ -165,9 +164,7 @@ char *parse_args(const char *doing,
                 unsigned num,
                 s16 min_level,
                 s16 max_level,
-                void *arg,
-                int (*unknown)(char *param, char *val,
-                               const char *doing, void *arg))
+                void *arg, parse_unknown_fn unknown)
 {
        char *param, *val, *err = NULL;
 
@@ -264,17 +261,22 @@ 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;
        }
 
        maybe_kfree_parameter(*(char **)kp->arg);
 
-       /* This is a hack.  We can't kmalloc in early boot, and we
-        * don't need to; this mangled commandline is preserved. */
+       /*
+        * 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);
@@ -512,7 +514,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;
@@ -743,8 +745,10 @@ void module_param_sysfs_remove(struct module *mod)
 {
        if (mod->mkobj.mp) {
                sysfs_remove_group(&mod->mkobj.kobj, &mod->mkobj.mp->grp);
-               /* We are positive that no one is using any param
-                * attrs at this point.  Deallocate immediately. */
+               /*
+                * We are positive that no one is using any param
+                * attrs at this point. Deallocate immediately.
+                */
                free_module_param_attrs(&mod->mkobj);
        }
 }