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

Bug#946783: debootstrap: cannot specify --foreign and --unpack-tarball at the same time



Package: debootstrap
Version: 1.0.114
Severity: normal
Tags: patch

Dear Maintainer,

After upgrading to Buster, one of my scripts that uses debootstrap has stopped
working, specifically on a step that involves both the --foreign option and the
--unpack-tarball option.

Reproduction steps:

    $ sudo debootstrap --variant=minbase --make-tarball=test.tgz stretch test
    $ sudo debootstrap --variant=minbase --foreign --unpack-tarball=$PWD/test.tgz stretch test

When I run the second command, I get the following output:

   /usr/sbin/debootstrap: 266: [: --unpack-tarball=/homeworld/reproduce/test.tgz: unexpected operator
   E: --foreign is specified with --unpack-tarball=/homeworld/reproduce/test.tgz, please use only one of those options.

I would expect that these two options could be used together, and there appears
to be code provided in /usr/share/debootstrap/functions that would allow this
particular combination:

	########################################################### option handling
	check_conflicting_option () {
		if [ "$set_what_to_do" = --foreign ] && [ "${1%%=*}" = --unpack-tarball ] || \
		   [ "${set_what_to_do%%=*}" = "--unpack-tarball" ] && [ "$1" == --foreign ]; then
			LOOSEN_CONFLICTING_RESTRICTION="true"
		elif [ -n "$set_what_to_do" ]; then
			error 1 ARG_CONFLICTING "$set_what_to_do is specified with $1, please use only one of those options."
		fi
		set_what_to_do="$1"
	}

It seems to me that there are two bugs here:

   * sh's test builtin does not support '==', whereas bash's does, so the use
     of '==' causes the 'unexpected operator' error above.
   * sh's order of operations does not distinguish between && and ||, so the
     series of logical operators mean ((A && B) || C) && D, rather than
     (A && B) || (C && D).

I was able to solve this, at least for my use case, with the following patch:

--- /usr/share/debootstrap/functions	2019-12-15 14:20:12.689000000 -0500
+++ /usr/share/debootstrap/functions	2019-12-15 14:20:27.872000000 -0500
@@ -262,8 +262,8 @@
 
 ########################################################### option handling
 check_conflicting_option () {
-	if [ "$set_what_to_do" = --foreign ] && [ "${1%%=*}" = --unpack-tarball ] || \
-	   [ "${set_what_to_do%%=*}" = "--unpack-tarball" ] && [ "$1" == --foreign ]; then
+	if ( [ "$set_what_to_do" = --foreign ] && [ "${1%%=*}" = --unpack-tarball ] ) || \
+	   ( [ "${set_what_to_do%%=*}" = "--unpack-tarball" ] && [ "$1" = --foreign ] ); then
 		LOOSEN_CONFLICTING_RESTRICTION="true"
 	elif [ -n "$set_what_to_do" ]; then
 		error 1 ARG_CONFLICTING "$set_what_to_do is specified with $1, please use only one of those options."

I believe this bug was introduced by commit 25d80b10319ed292827d016bfea6edcdb51b9b52,
during the fix for bug #551838.

-- System Information:
Debian Release: 10.2
  APT prefers stable
  APT policy: (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 4.19.84-1.pvops.qubes.x86_64 (SMP w/4 CPU cores)
Kernel taint flags: TAINT_OOT_MODULE
Locale: LANG=C, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE=C (charmap=UTF-8)
Shell: /bin/sh linked to /usr/bin/dash
Init: unable to detect

Versions of packages debootstrap depends on:
ii  wget  1.20.1-1.1

Versions of packages debootstrap recommends:
pn  arch-test               <none>
ii  debian-archive-keyring  2019.1
ii  gnupg                   2.2.12-1+deb10u1

Versions of packages debootstrap suggests:
pn  squid-deb-proxy-client  <none>
pn  ubuntu-archive-keyring  <none>

-- no debconf information


Reply to: