summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--init25
-rw-r--r--init_functions25
2 files changed, 27 insertions, 23 deletions
diff --git a/init b/init
index d79dd3d..e230f82 100644
--- a/init
+++ b/init
@@ -19,8 +19,6 @@ else
fi
/bin/mount -t tmpfs run /run -o nosuid,noexec,nodev,mode=1777,size=10M
-read CMDLINE </proc/cmdline
-
root=""
init=""
echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
@@ -28,27 +26,8 @@ echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
# set default mount handler
mount_handler="default_mount_handler"
-for cmd in ${CMDLINE}; 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
+# parse the kernel command line
+parse_cmdline
# if available, start udevd at this stage
if [ -x /sbin/udevd ]; then
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."