]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(10i18n): stop leaking shell options
authorPavel Valena <pvalena@redhat.com>
Fri, 25 Mar 2022 16:26:19 +0000 (17:26 +0100)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Mon, 4 Apr 2022 08:00:10 +0000 (08:00 +0000)
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.

modules.d/10i18n/module-setup.sh

index f25026fb803eef9f3d4919a8c08db10e124c3842..35bda36fbfd5a685fb43aa59829b83b9b8c21a9f 100755 (executable)
@@ -31,10 +31,6 @@ install() {
     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
@@ -46,7 +42,10 @@ install() {
             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