[arch-projects] [devtools] [PATCH 2/3] makechrootpkg: properly handle makepkg args
Luke Shumaker
lukeshu at sbcglobal.net
Sat May 10 20:10:35 EDT 2014
At Sat, 10 May 2014 09:44:33 -0400,
Dave Reisner wrote:
> This allows handling of args with whitespace and other nonsense to be
> passed properly to makepkg. Contrived example:
>
> makechrootpkg -r /path/to/chroot -- --config "/path/to/some config"
Unless I'm missing something, this patch won't successfully do that.
> @@ -100,7 +100,7 @@ else
> fi
>
> # Pass all arguments after -- right to makepkg
> -makepkg_args="$makepkg_args ${*:$OPTIND}"
> +makepkg_args=("${@:OPTIND}")
What about the previous value of makepkg_args?
> @@ -256,8 +256,9 @@ EOF
>
> # This is a little gross, but this way the script is recreated every time in the
> # working copy
> + printf -v extra_args ' %q' "${makepkg_args[@]}"
> printf $'#!/bin/bash\n%s\n_chrootbuild %q %q' "$(declare -f _chrootbuild)" \
> - "$makepkg_args" "$run_namcap" >"$copydir/chrootbuild"
> + "$extra_args" "$run_namcap" >"$copydir/chrootbuild"
> chmod +x "$copydir/chrootbuild"
> }
I believe that the arguments are getting double-escaped; once by %q in
the first printf, then again in the second printf. Also, this leaks
$extra_args as a global.
> @@ -320,7 +321,7 @@ _chrootbuild() {
> exit 1
> fi
>
> - sudo -u nobody makepkg $makepkg_args || exit 1
> + sudo -u nobody makepkg "$makepkg_args" || exit 1
However extra_args was escaped, doesn't this basically ignore that,
and shove it all into one argument?
----
Interestingly, I was just getting ready to submit a patch also does
this:
From 35b2638d44de2b9033b8c71163c997c588ded6fa Mon Sep 17 00:00:00 2001
From: Luke Shumaker <LukeShu at sbcglobal.net>
Date: Sat, 10 May 2014 19:21:44 -0400
Subject: [PATCH] makechrootpkg: Store makepkg_args as an array.
To do this simply, instead of embedding makepkg_args in /chrootbuild, it
passes them as arguments to /chrootbuild.
---
makechrootpkg.in | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/makechrootpkg.in b/makechrootpkg.in
index 6a99408..f646117 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -12,7 +12,8 @@ m4_include(lib/common.sh)
shopt -s nullglob
-makepkg_args='-s --noconfirm -L --holdver'
+default_makepkg_args=(-s --noconfirm -L --holdver)
+makepkg_args=("${default_makepkg_args[@]}")
repack=false
update_first=false
clean_first=false
@@ -46,7 +47,7 @@ usage() {
echo 'command:'
echo ' mkarchroot <chrootdir>/root base-devel'
echo ''
- echo "Default makepkg args: $makepkg_args"
+ echo "Default makepkg args: ${default_makepkg_args[*]}"
echo ''
echo 'Flags:'
echo '-h This help'
@@ -76,7 +77,7 @@ while getopts 'hcur:I:l:nTD:d:' arg; do
r) passeddir="$OPTARG" ;;
I) install_pkgs+=("$OPTARG") ;;
l) copy="$OPTARG" ;;
- n) run_namcap=true; makepkg_args="$makepkg_args -i" ;;
+ n) run_namcap=true; makepkg_args+=('-i') ;;
T) temp_chroot=true; copy+="-$$" ;;
esac
done
@@ -100,7 +101,7 @@ else
fi
# Pass all arguments after -- right to makepkg
-makepkg_args="$makepkg_args ${*:$OPTIND}"
+makepkg_args+=("${@:OPTIND}")
# See if -R was passed to makepkg
for arg in "${@:OPTIND}"; do
@@ -256,8 +257,8 @@ EOF
# This is a little gross, but this way the script is recreated every time in the
# working copy
- printf $'#!/bin/bash\n%s\n_chrootbuild %q %q' "$(declare -f _chrootbuild)" \
- "$makepkg_args" "$run_namcap" >"$copydir/chrootbuild"
+ printf $'#!/bin/bash\n%s\n_chrootbuild %q "$@"' "$(declare -f _chrootbuild)" \
+ "$run_namcap" >"$copydir/chrootbuild"
chmod +x "$copydir/chrootbuild"
}
@@ -283,8 +284,8 @@ download_sources() {
_chrootbuild() {
# This function isn't run in makechrootpkg,
# so no global variables
- local makepkg_args="$1"
- local run_namcap="$2"
+ local run_namcap="$1"; shift
+ local makepkg_args=("$@")
. /etc/profile
export HOME=/build
@@ -320,7 +321,7 @@ _chrootbuild() {
exit 1
fi
- sudo -u nobody makepkg $makepkg_args || exit 1
+ sudo -u nobody makepkg "${makepkg_args[@]}" || exit 1
if $run_namcap; then
pacman -S --needed --noconfirm namcap
@@ -379,7 +380,7 @@ if arch-nspawn "$copydir" \
--bind-ro="$PWD:/startdir_host" \
--bind-ro="$SRCDEST:/srcdest_host" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
- /chrootbuild
+ /chrootbuild "${makepkg_args[@]}"
then
move_products
else
--
1.9.2
More information about the arch-projects
mailing list