Drop parsing of /proc/cmdline by default, instead use argc + argv[]

For most use-cases the kernel will give Finit its arguments as proper
command line args in argc + argv[], like any other program.  However,
for some users, most notably Alpine Linux, there is a slightly broken
initramfs that cannot forward more than one argument using init_args,
for such systems you can re-enable the old behavior with a configure
switch --enable-kernel-cmdline -- it's not ideal but what can you do.

The main reason for removing this feature by default is to support
use-cases where Finit runs as the init for container apps that can read
/proc -- we do not want them to use the init args from the host.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2021-05-31 16:51:08 +02:00
1 parent 55e9cb2f58
commit cc6ffa35fc
4 files changed
+43 -11

No files matched your search

+30 -11
View File
@@ -145,24 +145,27 @@ static void parse_arg(char *arg)
single = 1;
}
void conf_parse_cmdline(int argc, char *argv[])
#ifdef KERNEL_CMDLINE
/*
* Parse /proc/cmdline to find args for init. Don't use this!
*
* Instead, rely on the kernel to give Finit its arguments as
* regular argc + argv[]. Only use this if the system you run
* on has a broken initramfs system that cannot forward args
* to Finit properly.
*/
static void parse_kernel_cmdline(void)
{
int dbg = 0;
FILE *fp;
char line[LINE_SIZE], *cmdline, *tok;
for (int i = 1; i < argc; i++)
parse_arg(argv[i]);
hide_args(argc, argv);
FILE *fp;
fp = fopen("/proc/cmdline", "r");
if (!fp)
goto done;
return;
if (!fgets(line, sizeof(line), fp)) {
fclose(fp);
goto done;
return;
}
cmdline = chomp(line);
@@ -173,8 +176,24 @@ void conf_parse_cmdline(int argc, char *argv[])
parse_arg(tok);
}
fclose(fp);
}
#else
#define parse_kernel_cmdline()
#endif
/*
* Kernel gives us all non-kernel options on our cmdline
*/
void conf_parse_cmdline(int argc, char *argv[])
{
int dbg = 0;
for (int i = 1; i < argc; i++)
parse_arg(argv[i]);
hide_args(argc, argv);
parse_kernel_cmdline();
done:
log_init(dbg);
}