Hi, currently you can't use an image which has whitespace in its filename as GRUB background image because grub-mkconfig_lib lacks proper variable quoting (see [1] for more information). I've attached three patches which should fix this problem:
quote-big.patch: This patch fixes the problem with the minimal set of changes. quote-medium.patch: This patch adds proper quoting wherever it is safe to do so. quote-small.patch This patch additionally adds quoting in cases like this: ${grub-probe} --foo --bar => "${grub-probe}" --foo --bar This breaks things if ${grub-probe} contains additional parameters. Please note that I already submitted similar patches a while ago[2], but these are a little outdated now. The attached patches have been refreshed and should apply cleanly to the current trunk. What do you think? Best regards Alexander Kurtz [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=612417#5 [2] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=612417#10
diff -Naur bazaar/util/grub-mkconfig_lib.in small/util/grub-mkconfig_lib.in --- bazaar/util/grub-mkconfig_lib.in 2011-04-05 10:38:13.357139000 +0200 +++ small/util/grub-mkconfig_lib.in 2011-04-05 14:10:09.617962451 +0200 @@ -44,20 +44,20 @@ make_system_path_relative_to_its_root () { - ${grub_mkrelpath} $1 + ${grub_mkrelpath} "${1}" } is_path_readable_by_grub () { - path=$1 + path="${1}" # abort if path doesn't exist - if test -e $path ; then : ;else + if test -e "${path}" ; then : ;else return 1 fi # abort if file is in a filesystem we can't read - if ${grub_probe} -t fs $path > /dev/null 2>&1 ; then : ; else + if ${grub_probe} -t fs "${path}" > /dev/null 2>&1 ; then : ; else return 1 fi
diff -Naur bazaar/util/grub-mkconfig_lib.in medium/util/grub-mkconfig_lib.in --- bazaar/util/grub-mkconfig_lib.in 2011-04-05 10:38:13.357139000 +0200 +++ medium/util/grub-mkconfig_lib.in 2011-04-05 14:10:21.136952907 +0200 @@ -16,19 +16,19 @@ transform="@program_transform_name@" -prefix=@prefix@ -exec_prefix=@exec_prefix@ -datarootdir=@datarootdir@ -datadir=@datadir@ -bindir=@bindir@ -sbindir=@sbindir@ -pkgdatadir=${datadir}/`echo @PACKAGE_TARNAME@ | sed "${transform}"` +prefix="@prefix@" +exec_prefix="@exec_prefix@" +datarootdir="@datarootdir@" +datadir="@datadir@" +bindir="@bindir@" +sbindir="@sbindir@" +pkgdatadir="${datadir}/`echo "@PACKAGE_TARNAME@" | sed "${transform}"`" -if test "x$grub_probe" = x; then - grub_probe=${sbindir}/`echo grub-probe | sed ${transform}` +if test "x${grub_probe}" = "x"; then + grub_probe="${sbindir}/`echo grub-probe | sed "${transform}"`" fi -if test "x$grub_mkrelpath" = x; then - grub_mkrelpath=${bindir}/`echo grub-mkrelpath | sed ${transform}` +if test "x${grub_mkrelpath}" = "x"; then + grub_mkrelpath="${bindir}/`echo grub-mkrelpath | sed "${transform}"`" fi if $(which gettext >/dev/null 2>/dev/null) ; then @@ -39,25 +39,25 @@ grub_warn () { - echo "Warning: $@" >&2 + echo "Warning: ${@}" >&2 } make_system_path_relative_to_its_root () { - ${grub_mkrelpath} $1 + ${grub_mkrelpath} "${1}" } is_path_readable_by_grub () { - path=$1 + path="${1}" # abort if path doesn't exist - if test -e $path ; then : ;else + if test -e "${path}" ; then : ;else return 1 fi # abort if file is in a filesystem we can't read - if ${grub_probe} -t fs $path > /dev/null 2>&1 ; then : ; else + if ${grub_probe} -t fs "${path}" > /dev/null 2>&1 ; then : ; else return 1 fi @@ -72,24 +72,24 @@ convert_system_path_to_grub_path () { - path=$1 + path="${1}" grub_warn "convert_system_path_to_grub_path() is deprecated. Use prepare_grub_to_access_device() instead." # abort if GRUB can't access the path - if is_path_readable_by_grub ${path} ; then : ; else + if is_path_readable_by_grub "${path}" ; then : ; else return 1 fi - if drive=`${grub_probe} -t drive $path` ; then : ; else + if drive="`${grub_probe} -t drive "${path}"`" ; then : ; else return 1 fi - if relative_path=`make_system_path_relative_to_its_root $path` ; then : ; else + if relative_path="`make_system_path_relative_to_its_root "${path}"`" ; then : ; else return 1 fi - echo ${drive}${relative_path} + echo "${drive}${relative_path}" } save_default_entry () @@ -103,15 +103,15 @@ prepare_grub_to_access_device () { - device=$1 + device="${1}" # Abstraction modules aren't auto-loaded. - abstraction="`${grub_probe} --device ${device} --target=abstraction`" + abstraction="`${grub_probe} --device "${device}" --target=abstraction`" for module in ${abstraction} ; do echo "insmod ${module}" done - partmap="`${grub_probe} --device ${device} --target=partmap`" + partmap="`${grub_probe} --device "${device}" --target=partmap`" for module in ${partmap} ; do case "${module}" in netbsd | openbsd) @@ -121,23 +121,23 @@ esac done - fs="`${grub_probe} --device ${device} --target=fs`" + fs="`${grub_probe} --device "${device}" --target=fs`" for module in ${fs} ; do echo "insmod ${module}" done # If there's a filesystem UUID that GRUB is capable of identifying, use it; # otherwise set root as per value in device.map. - echo "set root='`${grub_probe} --device ${device} --target=drive`'" - if fs_uuid="`${grub_probe} --device ${device} --target=fs_uuid 2> /dev/null`" ; then + echo "set root='`${grub_probe} --device "${device}" --target=drive`'" + if fs_uuid="`${grub_probe} --device "${device}" --target=fs_uuid 2> /dev/null`" ; then echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}" fi } grub_file_is_not_garbage () { - if test -f "$1" ; then - case "$1" in + if test -f "${1}" ; then + case "${1}" in *.dpkg-*) return 1 ;; # debian dpkg README*) return 1 ;; # documentation esac @@ -149,21 +149,21 @@ version_test_numeric () { - local a=$1 - local cmp=$2 - local b=$3 - if [ "$a" = "$b" ] ; then - case $cmp in + local a="${1}" + local cmp="${2}" + local b="${3}" + if [ "${a}" = "${b}" ] ; then + case "${cmp}" in ge|eq|le) return 0 ;; gt|lt) return 1 ;; esac fi - if [ "$cmp" = "lt" ] ; then - c=$a - a=$b - b=$c + if [ "${cmp}" = "lt" ] ; then + c="${a}" + a="${b}" + b="${c}" fi - if (echo $a ; echo $b) | sort -n | head -n 1 | grep -qx $b ; then + if (echo "${a}" ; echo "${b}") | sort -n | head -n 1 | grep -qx "${b}" ; then return 0 else return 1 @@ -172,54 +172,54 @@ version_test_gt () { - local a=`echo $1 | sed -e "s/[^-]*-//"` - local b=`echo $2 | sed -e "s/[^-]*-//"` + local a="`echo "${1}" | sed -e "s/[^-]*-//"`" + local b="`echo "${2}" | sed -e "s/[^-]*-//"`" local cmp=gt - if [ "x$b" = "x" ] ; then + if [ "x${b}" = "x" ] ; then return 0 fi - case $a:$b in + case "${a}:${b}" in *.old:*.old) ;; - *.old:*) a=`echo -n $a | sed -e s/\.old$//` ; cmp=gt ;; - *:*.old) b=`echo -n $b | sed -e s/\.old$//` ; cmp=ge ;; + *.old:*) a="`echo -n "${a}" | sed -e 's/\.old$//'`" ; cmp=gt ;; + *:*.old) b="`echo -n "${b}" | sed -e 's/\.old$//'`" ; cmp=ge ;; esac - version_test_numeric $a $cmp $b - return $? + version_test_numeric "${a}" "${cmp}" "${b}" + return "${?}" } version_find_latest () { local a="" - for i in $@ ; do - if version_test_gt "$i" "$a" ; then - a="$i" + for i in "${@}" ; do + if version_test_gt "${i}" "${a}" ; then + a="${i}" fi done - echo "$a" + echo "${a}" } # One layer of quotation is eaten by "", the second by sed, and the third by # printf; so this turns ' into \'. Note that you must use the output of # this function in a printf format string. gettext_quoted () { - $gettext "$@" | sed "s/'/'\\\\\\\\''/g" + ${gettext} "${@}" | sed "s/'/'\\\\\\\\''/g" } # Run the first argument through gettext_quoted, and then pass that and all # remaining arguments to printf. This is a useful abbreviation and tends to # be easier to type. gettext_printf () { - local format="$1" + local format="${1}" shift - printf "$(gettext_quoted "$format")" "$@" + printf "`gettext_quoted "${format}"`" "${@}" } uses_abstraction () { - device=$1 + device="${1}" - abstraction="`${grub_probe} --device ${device} --target=abstraction`" + abstraction="`${grub_probe} --device "${device}" --target=abstraction`" for module in ${abstraction}; do - if test "x${module}" = "x$2"; then + if test "x${module}" = "x${2}"; then return 0 fi done
diff -Naur bazaar/util/grub-mkconfig_lib.in big/util/grub-mkconfig_lib.in --- bazaar/util/grub-mkconfig_lib.in 2011-04-05 10:38:13.357139000 +0200 +++ big/util/grub-mkconfig_lib.in 2011-04-05 14:10:31.668952910 +0200 @@ -16,19 +16,19 @@ transform="@program_transform_name@" -prefix=@prefix@ -exec_prefix=@exec_prefix@ -datarootdir=@datarootdir@ -datadir=@datadir@ -bindir=@bindir@ -sbindir=@sbindir@ -pkgdatadir=${datadir}/`echo @PACKAGE_TARNAME@ | sed "${transform}"` +prefix="@prefix@" +exec_prefix="@exec_prefix@" +datarootdir="@datarootdir@" +datadir="@datadir@" +bindir="@bindir@" +sbindir="@sbindir@" +pkgdatadir="${datadir}/`echo "@PACKAGE_TARNAME@" | sed "${transform}"`" -if test "x$grub_probe" = x; then - grub_probe=${sbindir}/`echo grub-probe | sed ${transform}` +if test "x${grub_probe}" = "x"; then + grub_probe="${sbindir}/`echo grub-probe | sed "${transform}"`" fi -if test "x$grub_mkrelpath" = x; then - grub_mkrelpath=${bindir}/`echo grub-mkrelpath | sed ${transform}` +if test "x${grub_mkrelpath}" = "x"; then + grub_mkrelpath="${bindir}/`echo grub-mkrelpath | sed "${transform}"`" fi if $(which gettext >/dev/null 2>/dev/null) ; then @@ -39,25 +39,25 @@ grub_warn () { - echo "Warning: $@" >&2 + echo "Warning: ${@}" >&2 } make_system_path_relative_to_its_root () { - ${grub_mkrelpath} $1 + "${grub_mkrelpath}" "${1}" } is_path_readable_by_grub () { - path=$1 + path="${1}" # abort if path doesn't exist - if test -e $path ; then : ;else + if test -e "${path}" ; then : ;else return 1 fi # abort if file is in a filesystem we can't read - if ${grub_probe} -t fs $path > /dev/null 2>&1 ; then : ; else + if "${grub_probe}" -t fs "${path}" > /dev/null 2>&1 ; then : ; else return 1 fi @@ -72,24 +72,24 @@ convert_system_path_to_grub_path () { - path=$1 + path="${1}" grub_warn "convert_system_path_to_grub_path() is deprecated. Use prepare_grub_to_access_device() instead." # abort if GRUB can't access the path - if is_path_readable_by_grub ${path} ; then : ; else + if is_path_readable_by_grub "${path}" ; then : ; else return 1 fi - if drive=`${grub_probe} -t drive $path` ; then : ; else + if drive="`"${grub_probe}" -t drive "${path}"`" ; then : ; else return 1 fi - if relative_path=`make_system_path_relative_to_its_root $path` ; then : ; else + if relative_path="`make_system_path_relative_to_its_root "${path}"`" ; then : ; else return 1 fi - echo ${drive}${relative_path} + echo "${drive}${relative_path}" } save_default_entry () @@ -103,15 +103,15 @@ prepare_grub_to_access_device () { - device=$1 + device="${1}" # Abstraction modules aren't auto-loaded. - abstraction="`${grub_probe} --device ${device} --target=abstraction`" + abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`" for module in ${abstraction} ; do echo "insmod ${module}" done - partmap="`${grub_probe} --device ${device} --target=partmap`" + partmap="`"${grub_probe}" --device "${device}" --target=partmap`" for module in ${partmap} ; do case "${module}" in netbsd | openbsd) @@ -121,23 +121,23 @@ esac done - fs="`${grub_probe} --device ${device} --target=fs`" + fs="`"${grub_probe}" --device "${device}" --target=fs`" for module in ${fs} ; do echo "insmod ${module}" done # If there's a filesystem UUID that GRUB is capable of identifying, use it; # otherwise set root as per value in device.map. - echo "set root='`${grub_probe} --device ${device} --target=drive`'" - if fs_uuid="`${grub_probe} --device ${device} --target=fs_uuid 2> /dev/null`" ; then + echo "set root='`"${grub_probe}" --device "${device}" --target=drive`'" + if fs_uuid="`"${grub_probe}" --device "${device}" --target=fs_uuid 2> /dev/null`" ; then echo "search --no-floppy --fs-uuid --set=root ${fs_uuid}" fi } grub_file_is_not_garbage () { - if test -f "$1" ; then - case "$1" in + if test -f "${1}" ; then + case "${1}" in *.dpkg-*) return 1 ;; # debian dpkg README*) return 1 ;; # documentation esac @@ -149,21 +149,21 @@ version_test_numeric () { - local a=$1 - local cmp=$2 - local b=$3 - if [ "$a" = "$b" ] ; then - case $cmp in + local a="${1}" + local cmp="${2}" + local b="${3}" + if [ "${a}" = "${b}" ] ; then + case "${cmp}" in ge|eq|le) return 0 ;; gt|lt) return 1 ;; esac fi - if [ "$cmp" = "lt" ] ; then - c=$a - a=$b - b=$c + if [ "${cmp}" = "lt" ] ; then + c="${a}" + a="${b}" + b="${c}" fi - if (echo $a ; echo $b) | sort -n | head -n 1 | grep -qx $b ; then + if (echo "${a}" ; echo "${b}") | sort -n | head -n 1 | grep -qx "${b}" ; then return 0 else return 1 @@ -172,54 +172,54 @@ version_test_gt () { - local a=`echo $1 | sed -e "s/[^-]*-//"` - local b=`echo $2 | sed -e "s/[^-]*-//"` + local a="`echo "${1}" | sed -e "s/[^-]*-//"`" + local b="`echo "${2}" | sed -e "s/[^-]*-//"`" local cmp=gt - if [ "x$b" = "x" ] ; then + if [ "x${b}" = "x" ] ; then return 0 fi - case $a:$b in + case "${a}:${b}" in *.old:*.old) ;; - *.old:*) a=`echo -n $a | sed -e s/\.old$//` ; cmp=gt ;; - *:*.old) b=`echo -n $b | sed -e s/\.old$//` ; cmp=ge ;; + *.old:*) a="`echo -n "${a}" | sed -e 's/\.old$//'`" ; cmp=gt ;; + *:*.old) b="`echo -n "${b}" | sed -e 's/\.old$//'`" ; cmp=ge ;; esac - version_test_numeric $a $cmp $b - return $? + version_test_numeric "${a}" "${cmp}" "${b}" + return "${?}" } version_find_latest () { local a="" - for i in $@ ; do - if version_test_gt "$i" "$a" ; then - a="$i" + for i in "${@}" ; do + if version_test_gt "${i}" "${a}" ; then + a="${i}" fi done - echo "$a" + echo "${a}" } # One layer of quotation is eaten by "", the second by sed, and the third by # printf; so this turns ' into \'. Note that you must use the output of # this function in a printf format string. gettext_quoted () { - $gettext "$@" | sed "s/'/'\\\\\\\\''/g" + "${gettext}" "${@}" | sed "s/'/'\\\\\\\\''/g" } # Run the first argument through gettext_quoted, and then pass that and all # remaining arguments to printf. This is a useful abbreviation and tends to # be easier to type. gettext_printf () { - local format="$1" + local format="${1}" shift - printf "$(gettext_quoted "$format")" "$@" + printf "`gettext_quoted "${format}"`" "${@}" } uses_abstraction () { - device=$1 + device="${1}" - abstraction="`${grub_probe} --device ${device} --target=abstraction`" + abstraction="`"${grub_probe}" --device "${device}" --target=abstraction`" for module in ${abstraction}; do - if test "x${module}" = "x$2"; then + if test "x${module}" = "x${2}"; then return 0 fi done
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel