[pacman-dev] [PATCH 5/7] pacman-key: fix quotation on several variable assignments

Dave Reisner d at falconindy.com
Fri Jul 8 08:56:37 EDT 2011


On Fri, Jul 08, 2011 at 09:59:30PM +1000, Allan McRae wrote:
> From: Ivan Kanakarakis <ivan.kanak at gmail.com>
> 
> This commit adds quotes to several variable assignments. Unquoted values
> can cause problems on several occasions if the value is empty. It is
> safer to have every assignment quoted.

Perhaps this is just academic, but is there a test case for this? I'm
not aware of any situation where this it's necessary to quote to
assignment of a command sub or simple variable to a var to avoid any
oddities.

  $ foo= bar="" baz=${notavar}
  $ echo ${#foo} ${#bar} ${#baz}
  0 0 0

> Signed-off-by: Ivan Kanakarakis <ivan.kanak at gmail.com>
> ---
>  scripts/pacman-key.sh.in |   16 ++++++++--------
>  1 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in
> index d75c111..b15a3a5 100644
> --- a/scripts/pacman-key.sh.in
> +++ b/scripts/pacman-key.sh.in
> @@ -137,12 +137,12 @@ reload_keyring() {
>  	if [[ -r "${REMOVED_KEYS}" ]]; then
>  		while read key; do
>  			local key_values name
> -			key_values=$(${GPG_PACMAN} --quiet --with-colons --list-key "${key}" | grep ^pub | cut -d: -f5,10 --output-delimiter=' ')
> +			key_values="$(${GPG_PACMAN} --quiet --with-colons --list-key "${key}" | grep ^pub | cut -d: -f5,10 --output-delimiter=' ')"
>  			if [[ -n $key_values ]]; then
>  				# The first word is the key_id
> -				key_id=${key_values%% *}
> +				key_id="${key_values%% *}"
>  				# the rest if the name of the owner
> -				name=${key_values#* }
> +				name="${key_values#* }"
>  				if [[ -n ${key_id} ]]; then
>  					# Mark this key to be deleted
>  					removed_ids[$key_id]="$name"
> @@ -152,12 +152,12 @@ reload_keyring() {
>  	fi
>  
>  	# List of keys that must be kept installed, even if in the list of keys to be removed
> -	local HOLD_KEYS=$(get_from "$CONFIG" "HoldKeys")
> +	local HOLD_KEYS="$(get_from "$CONFIG" "HoldKeys")"
>  
>  	# Remove the keys that must be kept from the set of keys that should be removed
>  	if [[ -n ${HOLD_KEYS} ]]; then
>  		for key in ${HOLD_KEYS}; do
> -			key_id=$(${GPG_PACMAN} --quiet --with-colons --list-key "${key}" | grep ^pub | cut -d: -f5)
> +			key_id="$(${GPG_PACMAN} --quiet --with-colons --list-key "${key}" | grep ^pub | cut -d: -f5)"
>  			if [[ -n "${removed_ids[$key_id]}" ]]; then
>  				unset removed_ids[$key_id]
>  			fi
> @@ -168,7 +168,7 @@ reload_keyring() {
>  	# be updated automatically.
>  	if [[ -r "${ADDED_KEYS}" ]]; then
>  		msg "$(gettext "Appending official keys...")"
> -		local add_keys=$(${GPG_NOKEYRING} --keyring "${ADDED_KEYS}" --with-colons --list-keys | grep ^pub | cut -d: -f5)
> +		local add_keys="$(${GPG_NOKEYRING} --keyring "${ADDED_KEYS}" --with-colons --list-keys | grep ^pub | cut -d: -f5)"
>  		for key_id in ${add_keys}; do
>  			# There is no point in adding a key that will be deleted right after
>  			if [[ -z "${removed_ids[$key_id]}" ]]; then
> @@ -179,7 +179,7 @@ reload_keyring() {
>  
>  	if [[ -r "${DEPRECATED_KEYS}" ]]; then
>  		msg "$(gettext "Appending deprecated keys...")"
> -		local add_keys=$(${GPG_NOKEYRING} --keyring "${DEPRECATED_KEYS}" --with-colons --list-keys | grep ^pub | cut -d: -f5)
> +		local add_keys="$(${GPG_NOKEYRING} --keyring "${DEPRECATED_KEYS}" --with-colons --list-keys | grep ^pub | cut -d: -f5)"
>  		for key_id in ${add_keys}; do
>  			# There is no point in adding a key that will be deleted right after
>  			if [[ -z "${removed_ids[$key_id]}" ]]; then
> @@ -264,7 +264,7 @@ if [[ ! -r "${CONFIG}" ]]; then
>  fi
>  
>  # Get GPGDIR from pacman.conf iff not specified on command line
> -if [[ -z PACMAN_KEYRING_DIR && GPGDIR=$(get_from "$CONFIG" "GPGDir") == 0 ]]; then
> +if [[ -z PACMAN_KEYRING_DIR && GPGDIR="$(get_from "$CONFIG" "GPGDir")" == 0 ]]; then

This doesn't pertain to this patch, but I don't understand this logic.
get_from should be writing the value of GPGDir as it's read from
$CONFIG. It looks like the goal here was to make sure that get_from was
successful, which would be written as:

  if [[ -z PACMAN_KEYRING_DIR ]] && GPGDIR=$(get_from "$CONFIG" "GPGDir"); then
    PACMAN_KEYRING_DIR=$GPGDIR
  fi
  PACMAN_KEYRING_DIR=${PACMAN_KEYRING_DIR:- at sysconfdir@/pacman.d/gnupg}

Or through a single default assignment to tidy the whole thing up:

  # if PACMAN_KEYRING_DIR isn't assigned, try to get it from the config
  # file, falling back on a hard default.
  : ${PACMAN_KEYRING_DIR:=$(get_from "$CONFIG" "GPGDir" || echo "@sysconfdir@/pacman.d/gnupg")}

Will happily write up a patch if this is what was actually intended...

d

>  	PACMAN_KEYRING_DIR="${GPGDIR}"
>  fi
>  PACMAN_KEYRING_DIR=${PACMAN_KEYRING_DIR:- at sysconfdir@/pacman.d/gnupg}
> -- 
> 1.7.6
> 
> 


More information about the pacman-dev mailing list