[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#887784: env-preseed: env2debconf doesn't handle single quotes



Package: env-preseed
Tags: patch

I booted the Debian-Installer with the following boot parameter:
preseed/early_command="sed -i 'script' filename"

and got the following error:
> preseed: running preseed command preseed/early_command: sed -i '"'"'script'"'"' filename
> log-output: sed: unsupported command "

The following is a fix:
diff --git a/env2debconf b/env2debconf
index 3032235..4026128 100755
--- a/env2debconf
+++ b/env2debconf
@@ -31,13 +31,11 @@ for line in $(set); do
 			fi
 			var="${var#*:}"
 			
-			# remove single quotes from around value
-			val="${val#\'}"
-			val="${val%\'}"
-			# remove double quotes (user can type those for values
-			# with spaces)
-			val="${val#\"}"
-			val="${val%\"}"
+			# Remove quotes. This shell doesn't support
+			# indirect expansion like Bash ${!var}, so
+			# resort to sed. Values may contain single
+			# quotes, like 'foo'"'"'bar'.
+			val="$(echo "$val" | sed "s/\"\([^\"]*\)\"\|'\([^']*\)'/\1\2/g")"
 			
 			IFS=$OLDIFS
 			if ! db_set "$var" "$val"; then

Explanation: env2debconf gets its list of environment variables from
$(set). The shell doesn't support indirect expansion like Bash ${!var},
so env2debconf gets the values from $(set)'s output, too. $(set) wraps
values in quotes, which env2debconf handles already, but it also escapes
quotes within values like so: foo'bar -> 'foo'"'"'bar'

Currently only the outer quotes are handled, causing syntax errors in
case of inner quotes: 'foo'"'"'bar' -> foo'"'"'bar :-(

This patch is a more general solution:
echo "'foo'\"'\"'bar'" | sed "s/\"\([^\"]*\)\"\|'\([^']*\)'/\1\2/g" ->
foo'bar :-)


Reply to: