summaryrefslogtreecommitdiffstats
path: root/init
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
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')
-rw-r--r--init25
1 files changed, 2 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