forked from Minki/linux
init: fix bug where environment vars can't be passed via boot args
Commit 026cee0086
had the side-effect of dropping the '=' from
the unknown boot arguments that are passed to init as environment
variables. This is because parse_args() puts a NUL in the string
where the '=' was when it passes the "param" and "val" pointers
to the parsing subfunctions. Previously, unknown_bootoption() was
the last parse_args() subfunction to run, and it carefully put back
the '=' character. Now the ignore_unknown_bootoption() is the last
one to run, and it wasn't doing the necessary repair, so the
envp params ended up with the embedded NUL and were no longer
seen as valid environment variables by init.
Tested-by: Woody Suwalski <terraluna977@gmail.com>
Acked-by: Pawel Moll <pawel.moll@arm.com>
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
This commit is contained in:
parent
66f75a5d02
commit
a99cd11251
25
init/main.c
25
init/main.c
@ -225,13 +225,9 @@ static int __init loglevel(char *str)
|
|||||||
|
|
||||||
early_param("loglevel", loglevel);
|
early_param("loglevel", loglevel);
|
||||||
|
|
||||||
/*
|
/* Change NUL term back to "=", to make "param" the whole string. */
|
||||||
* Unknown boot options get handed to init, unless they look like
|
static int __init repair_env_string(char *param, char *val)
|
||||||
* unused parameters (modprobe will find them in /proc/cmdline).
|
|
||||||
*/
|
|
||||||
static int __init unknown_bootoption(char *param, char *val)
|
|
||||||
{
|
{
|
||||||
/* Change NUL term back to "=", to make "param" the whole string. */
|
|
||||||
if (val) {
|
if (val) {
|
||||||
/* param=val or param="val"? */
|
/* param=val or param="val"? */
|
||||||
if (val == param+strlen(param)+1)
|
if (val == param+strlen(param)+1)
|
||||||
@ -243,6 +239,16 @@ static int __init unknown_bootoption(char *param, char *val)
|
|||||||
} else
|
} else
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unknown boot options get handed to init, unless they look like
|
||||||
|
* unused parameters (modprobe will find them in /proc/cmdline).
|
||||||
|
*/
|
||||||
|
static int __init unknown_bootoption(char *param, char *val)
|
||||||
|
{
|
||||||
|
repair_env_string(param, val);
|
||||||
|
|
||||||
/* Handle obsolete-style parameters */
|
/* Handle obsolete-style parameters */
|
||||||
if (obsolete_checksetup(param))
|
if (obsolete_checksetup(param))
|
||||||
@ -732,11 +738,6 @@ static char *initcall_level_names[] __initdata = {
|
|||||||
"late parameters",
|
"late parameters",
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init ignore_unknown_bootoption(char *param, char *val)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init do_initcall_level(int level)
|
static void __init do_initcall_level(int level)
|
||||||
{
|
{
|
||||||
extern const struct kernel_param __start___param[], __stop___param[];
|
extern const struct kernel_param __start___param[], __stop___param[];
|
||||||
@ -747,7 +748,7 @@ static void __init do_initcall_level(int level)
|
|||||||
static_command_line, __start___param,
|
static_command_line, __start___param,
|
||||||
__stop___param - __start___param,
|
__stop___param - __start___param,
|
||||||
level, level,
|
level, level,
|
||||||
ignore_unknown_bootoption);
|
repair_env_string);
|
||||||
|
|
||||||
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
|
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
|
||||||
do_one_initcall(*fn);
|
do_one_initcall(*fn);
|
||||||
|
Loading…
Reference in New Issue
Block a user