Avoid using shell options in findkeymap, instead of using a wrapper[*]
to restore the previous options. Using mapfile and find to generate the list
of files also has the benefit of being more readable in this case.
[*] Reverted commit
35064768ebf14d3ec6bf3f7df52580fb4920ea3d
Original issue description from Michal Hecko <mhecko@redhat.com>:
The findkeymap function manipulates the shell options and relies on
restoring them using the trap. However, as the function might be called
recursively, each recursive invocation changes the signal handler to its
own. As the recursion is entered with shell options already modified,
the changed trap handler is replaced with restoration to the modified
shell options, not the original ones.
VCONFIG_CONF="/etc/vconsole.conf"
findkeymap() {
- # shellcheck disable=SC2064
- trap "$(shopt -p nullglob globstar)" RETURN
- shopt -q -s nullglob globstar
-
local -a MAPS
local MAPNAME
local INCLUDES
MAPS=("$1")
else
MAPNAME=${1%.map*}
- MAPS=("$dracutsysrootdir""${kbddir}"/keymaps/**/"${MAPNAME}"{,.map{,.*}})
+
+ mapfile -t -d '' MAPS < <(
+ find "${dracutsysrootdir}${kbddir}"/keymaps/ -type f \( -name "${MAPNAME}" -o -name "${MAPNAME}.map*" \) -print0
+ )
fi
for MAP in "${MAPS[@]}"; do