From: Michal Schmidt <mschmidt@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Rusty Russell <rusty@rustcorp.com.au>,
Randy Dunlap <rdunlap@xenotime.net>,
Michal Schmidt <mschmidt@redhat.com>
Subject: [PATCH] params: make dashes and underscores in parameter names truly equal
Date: Mon, 10 Oct 2011 00:03:37 +0200 [thread overview]
Message-ID: <1318197817-20964-1-git-send-email-mschmidt@redhat.com> (raw)
The user may use "foo-bar" for a kernel parameter defined as "foo_bar".
Make sure it works the other way around too.
Apply the equality of dashes and underscores on early_params and __setup
params as well.
The example given in Documentation/kernel-parameters.txt indicates that
this is the intended behaviour.
With the patch the kernel accepts "log-buf-len=1M" as expected.
https://bugzilla.redhat.com/show_bug.cgi?id=744545
Signed-off-by: Michal Schmidt <mschmidt@redhat.com>
---
include/linux/moduleparam.h | 20 ++++++++++++++++++++
init/main.c | 4 ++--
kernel/params.c | 34 +++++++++++++++++++++++++++-------
3 files changed, 49 insertions(+), 9 deletions(-)
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
index 56bda92..609f89c 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -267,6 +267,26 @@ static inline void __kernel_param_unlock(void)
.str = &__param_string_##name, 0, perm); \
__MODULE_PARM_TYPE(name, "string")
+/**
+ * parameq - checks if two parameter names match
+ * @name1: parameter name 1
+ * @name2: parameter name 2
+ *
+ * Returns true if the two parameter names are equal.
+ * Dashes (-) are considered equal to underscores (_).
+ */
+extern bool parameq(const char *name1, const char *name2);
+
+/**
+ * parameqn - checks if two parameter names match
+ * @name1: parameter name 1
+ * @name2: parameter name 2
+ * @n: the maximum length to compare
+ *
+ * Similar to parameq(), except it compares at most @n characters.
+ */
+extern bool parameqn(const char *name1, const char *name2, size_t n);
+
/* Called on module insert or kernel boot */
extern int parse_args(const char *name,
char *args,
diff --git a/init/main.c b/init/main.c
index 03b408d..63f5f6f 100644
--- a/init/main.c
+++ b/init/main.c
@@ -163,7 +163,7 @@ static int __init obsolete_checksetup(char *line)
p = __setup_start;
do {
int n = strlen(p->str);
- if (!strncmp(line, p->str, n)) {
+ if (parameqn(line, p->str, n)) {
if (p->early) {
/* Already done in parse_early_param?
* (Needs exact match on param part).
@@ -392,7 +392,7 @@ static int __init do_early_param(char *param, char *val)
const struct obs_kernel_param *p;
for (p = __setup_start; p < __setup_end; p++) {
- if ((p->early && strcmp(param, p->str) == 0) ||
+ if ((p->early && parameq(param, p->str)) ||
(strcmp(param, "console") == 0 &&
strcmp(p->str, "earlycon") == 0)
) {
diff --git a/kernel/params.c b/kernel/params.c
index 1d1c01b..aa8933c 100644
--- a/kernel/params.c
+++ b/kernel/params.c
@@ -67,20 +67,40 @@ static void maybe_kfree_parameter(void *param)
}
}
-static inline char dash2underscore(char c)
+static char dash2underscore(char c)
{
if (c == '-')
return '_';
return c;
}
-static inline int parameq(const char *input, const char *paramname)
+bool parameq(const char *name1, const char *name2)
{
- unsigned int i;
- for (i = 0; dash2underscore(input[i]) == paramname[i]; i++)
- if (input[i] == '\0')
- return 1;
- return 0;
+ char c1, c2;
+ while (1) {
+ c1 = dash2underscore(*name1++);
+ c2 = dash2underscore(*name2++);
+ if (c1 != c2)
+ return false;
+ if (c1 == '\0')
+ break;
+ }
+ return true;
+}
+
+bool parameqn(const char *name1, const char *name2, size_t n)
+{
+ char c1, c2;
+ while (n) {
+ c1 = dash2underscore(*name1++);
+ c2 = dash2underscore(*name2++);
+ if (c1 != c2)
+ return false;
+ if (c1 == '\0')
+ break;
+ n--;
+ }
+ return true;
}
static int parse_one(char *param,
--
1.7.4.4
next reply other threads:[~2011-10-09 22:03 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-09 22:03 Michal Schmidt [this message]
2011-10-12 23:28 ` [PATCH] params: make dashes and underscores in parameter names truly equal Rusty Russell
2011-10-13 14:41 ` Michal Schmidt
2011-10-18 3:58 ` Rusty Russell
2011-10-18 19:01 ` Randy Dunlap
2011-10-19 3:00 ` Rusty Russell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1318197817-20964-1-git-send-email-mschmidt@redhat.com \
--to=mschmidt@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rdunlap@xenotime.net \
--cc=rusty@rustcorp.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.