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 <[email protected]>
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

Reply via email to