diff options
author | Thomas Bächler <thomas@archlinux.org> | 2011-04-10 21:34:55 +0200 |
---|---|---|
committer | Thomas Bächler <thomas@archlinux.org> | 2011-04-10 21:34:55 +0200 |
commit | d1264eb145c0aa0adc219dfb71fa5d7acc4e26ff (patch) | |
tree | 33e159fd17816b6237a9647044f54301b52f361c | |
parent | 9fcd9c15d1d8c4542896da6cc0b6a75d43781fd3 (diff) | |
download | mkinitcpio-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-- | init | 25 | ||||
-rw-r--r-- | init_functions | 25 |
2 files changed, 27 insertions, 23 deletions
@@ -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." |