Skip to content

Commit

Permalink
dracut-lib.sh: quote variables in parameter expansion patterns
Browse files Browse the repository at this point in the history
According to POSIX.1-2017, 2.6.2 Parameter Expansion:

${parameter%[word]} [...] The word shall be expanded to produce a
pattern.

This means if word contains variables that itself contain special
characters like asterisks or backslashes, these are treated as pattern
characters unless the variable is quoted. Try e.g. the following example
in bash, dash or (busybox) ash:

i='a\c'; j='\'; echo "${i%$j*}"

This prints "a\c" because "$j*" is expanded to "\*", escaping the
asterisk. In contrast,

i='a\c'; j='\'; echo "${i%"$j"*}"

produces the expected result "a" because the backslash is not specially
treated any more after quoting.

The quotes that this commit adds have been previously removed in commit
f9c96cf, citing issues with busybox
hush without further specifying the actual error. I tested a recent
busybox build (upstream commit 9aa751b08ab03d6396f86c3df77937a19687981b)
and couldn't find any problems. Note that the above example always
produces "a\c" in hush regardless of quoting $j, making hush unsuitable
for use with dracut, but using quotes in parameter expansions generally
works.

The unquoted variables break the "rd.luks.uuid/name" kernel command line
options in dracut 050 because

str_replace "$luksname" '\' '\\'

in modules.d/90crypt/parse-crypt.sh is not able to escape the
backslashes any more, see GH-723, GH-727: backslashes in the
systemd-cryptsetup@.service unit name stay unescaped for use in udev
(cf. commit 0f6d93e), leading to
failures in starting the unit.

This partially reverts commit f9c96cf.
  • Loading branch information
diabonas authored and haraldh committed Apr 20, 2020
1 parent 25c7a13 commit 8e1a4dc
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions modules.d/99base/dracut-lib.sh
Expand Up @@ -24,7 +24,7 @@ debug_on() {

# returns OK if $1 contains literal string $2 (and isn't empty)
strstr() {
[ "${1##*$2*}" != "$1" ]
[ "${1##*"$2"*}" != "$1" ]
}

# returns OK if $1 matches (completely) glob pattern $2
Expand All @@ -43,18 +43,18 @@ strglobin() {

# returns OK if $1 contains literal string $2 at the beginning, and isn't empty
str_starts() {
[ "${1#$2*}" != "$1" ]
[ "${1#"$2"*}" != "$1" ]
}

# returns OK if $1 contains literal string $2 at the end, and isn't empty
str_ends() {
[ "${1%*$2}" != "$1" ]
[ "${1%*"$2"}" != "$1" ]
}

trim() {
local var="$*"
var="${var#${var%%[![:space:]]*}}" # remove leading whitespace characters
var="${var%${var##*[![:space:]]}}" # remove trailing whitespace characters
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
printf "%s" "$var"
}

Expand Down Expand Up @@ -108,9 +108,9 @@ str_replace() {
local out=''

while strstr "${in}" "$s"; do
chop="${in%%$s*}"
chop="${in%%"$s"*}"
out="${out}${chop}$r"
in="${in#*$s}"
in="${in#*"$s"}"
done
echo "${out}${in}"
}
Expand Down Expand Up @@ -396,7 +396,7 @@ splitsep() {
while [ -n "$str" -a "$#" -gt 1 ]; do
tmp="${str%%$sep*}"
eval "$1='${tmp}'"
str="${str#$tmp}"
str="${str#"$tmp"}"
str="${str#$sep}"
shift
done
Expand Down

0 comments on commit 8e1a4dc

Please sign in to comment.