summaryrefslogtreecommitdiffstats
path: root/init_functions
diff options
context:
space:
mode:
authorThomas Bächler <thomas@archlinux.org>2011-04-10 21:34:55 +0200
committerThomas Bächler <thomas@archlinux.org>2011-04-10 21:34:55 +0200
commitd1264eb145c0aa0adc219dfb71fa5d7acc4e26ff (patch)
tree33e159fd17816b6237a9647044f54301b52f361c /init_functions
parent9fcd9c15d1d8c4542896da6cc0b6a75d43781fd3 (diff)
downloadmkinitcpio-d1264eb145c0aa0adc219dfb71fa5d7acc4e26ff.tar.gz
mkinitcpio-d1264eb145c0aa0adc219dfb71fa5d7acc4e26ff.tar.xz
Fix problems in parsing the kernel command line
The kernel command line allows quoted strings with whitespace in them. Until now, such parameters would crash /init and cause a kernel panic. Move parsing into a function and use the 'set' builtin to split /proc/cmdline into arguments. Fixes FS#13900 and FS#22080.
Diffstat (limited to 'init_functions')
-rw-r--r--init_functions25
1 files changed, 25 insertions, 0 deletions
diff --git a/init_functions b/init_functions
index a42d257..fd5bbb6 100644
--- a/init_functions
+++ b/init_functions
@@ -30,6 +30,31 @@ launch_interactive_shell() {
/bin/sh -i
}
+parse_cmdline() {
+ eval set -- $(cat /proc/cmdline)
+ for cmd in "$@"; do
+ case "${cmd}" in
+ \#*) break ;; # ignore everything after a # in the commandline
+ # The kernel passes those to the kernel on its own
+ [0123456Ss]) ;;
+ [0-9]*) ;;
+ single) ;;
+ rw) readwrite="yes" ;;
+ ro) readwrite="no" ;;
+ # only export stuff that does work with ash :)
+ *=*) rhs="$(echo "${cmd}" | cut -d= -f2-)"
+ cmd="$(echo "${cmd}" | cut -d= -f1 | sed 's|\.|_|g')"
+ cmd="$(echo "${cmd}" | sed 's|-|_|g')=\"${rhs}\""
+ (echo "${cmd}" | grep -qe '^[0-9]') || eval "${cmd}"
+ ;;
+ *) cmd="$(echo "${cmd}" | sed 's|\.|_|g')"
+ cmd="$(echo "${cmd}" | sed 's|-|_|g')"
+ (echo "${cmd}" | grep -qe '^[0-9]') || eval "${cmd}=y"
+ ;;
+ esac
+ done
+}
+
default_mount_handler() {
if [ ${root:0:5} != "/dev/" ] || ! poll_device "${root}" ${rootdelay}; then
msg "Root device '${root}' doesn't exist. Attempting to create it."