Просмотр исходного кода

Do not use absolute paths for programs in perl and shell code

The location of programs on the filesystem is not standardized, and as
such using absolute paths is not a portable assumption to make. This
causes test suite errors on at least Mac OS X.

Use just the program name on perl system() calls, when needing the full
path use Dpkg::Path::find_command() in perl code and “which” in shell
code.

Reported-by: Stuart Ambler <stuart@zulazon.com>
Guillem Jover лет назад: 14
Родитель
Сommit
383247f0d2

+ 1 - 0
debian/changelog

@@ -41,6 +41,7 @@ dpkg (1.16.2) UNRELEASED; urgency=low
     currently supported value is “extreme” for xz. Closes: #647915
     currently supported value is “extreme” for xz. Closes: #647915
   * Stop using brace expansion to install man pages by using dh_installman
   * Stop using brace expansion to install man pages by using dh_installman
     instead of dh_install, the former does not abort on empty glob expansion.
     instead of dh_install, the former does not abort on empty glob expansion.
+  * Do not use absolute paths for programs in perl and shell code.
 
 
   [ Raphaël Hertzog ]
   [ Raphaël Hertzog ]
   * Update Dpkg::Shlibs to look into multiarch paths when cross-building
   * Update Dpkg::Shlibs to look into multiarch paths when cross-building

+ 1 - 1
dselect/methods/Debian/Dselect/Ftp.pm

@@ -58,7 +58,7 @@ sub store_config {
 
 
 sub view_mirrors {
 sub view_mirrors {
   if (-f '/usr/lib/dpkg/methods/ftp/README.mirrors.txt') {
   if (-f '/usr/lib/dpkg/methods/ftp/README.mirrors.txt') {
-    system('/usr/bin/pager', '/usr/lib/dpkg/methods/ftp/README.mirrors.txt');
+    system('pager', '/usr/lib/dpkg/methods/ftp/README.mirrors.txt');
   } elsif (-f '/usr/lib/dpkg/methods/ftp/README.mirrors.txt.gz') {
   } elsif (-f '/usr/lib/dpkg/methods/ftp/README.mirrors.txt.gz') {
     system('gzip -dc /usr/lib/dpkg/methods/ftp/README.mirrors.txt.gz | pager');
     system('gzip -dc /usr/lib/dpkg/methods/ftp/README.mirrors.txt.gz | pager');
   } else {
   } else {

+ 3 - 3
dselect/methods/disk/setup

@@ -241,7 +241,7 @@ then
 			response="$defaultnfsserver"
 			response="$defaultnfsserver"
 		fi
 		fi
 		if [ -z "$response" ]; then continue; fi
 		if [ -z "$response" ]; then continue; fi
-		if [ -x /usr/bin/rpcinfo ]
+		if [ -x "`which rpcinfo`" ]
 		then
 		then
 			if rpcinfo -u "$response" mountd | grep -q 'ready'
 			if rpcinfo -u "$response" mountd | grep -q 'ready'
 			then
 			then
@@ -249,7 +249,7 @@ then
 			else
 			else
 				echo "$response appears not to be an NFS server."
 				echo "$response appears not to be an NFS server."
 			fi
 			fi
-		elif [ -x /bin/ping ]
+		elif [ -x "`which ping`" ]
 		then
 		then
 			if ping -q -c 1 "$response" | grep -q ', 1 packets received'
 			if ping -q -c 1 "$response" | grep -q ', 1 packets received'
 			then
 			then
@@ -259,7 +259,7 @@ then
 			fi
 			fi
 		else
 		else
 			echo \
 			echo \
-"(I can't check that now because there is no /usr/bin/rpcinfo or /bin/ping.)"
+"(I can't check that now because there is no rpcinfo or ping.)"
 			nfsserver="$response"
 			nfsserver="$response"
 		fi
 		fi
 	done
 	done

+ 1 - 1
dselect/methods/ftp/install

@@ -131,7 +131,7 @@ procstatus();
 sub dcmpvers {
 sub dcmpvers {
     my($a, $p, $b) = @_;
     my($a, $p, $b) = @_;
     my ($r);
     my ($r);
-    $r = system("/usr/bin/dpkg", "--compare-versions", "$a", "$p", "$b");
+    $r = system("dpkg", "--compare-versions", "$a", "$p", "$b");
     $r = $r/256;
     $r = $r/256;
     if ($r == 0) {
     if ($r == 0) {
 	return 1;
 	return 1;

+ 2 - 2
dselect/methods/multicd/install

@@ -53,7 +53,7 @@ xit=1
 do_umount() {
 do_umount() {
 	if [ "$method" = "multi_mount" ]
 	if [ "$method" = "multi_mount" ]
 	then
 	then
-		echo /bin/true
+		echo true
 		return
 		return
 	fi
 	fi
 	if [ -n "$umount" ]; then
 	if [ -n "$umount" ]; then
@@ -66,7 +66,7 @@ do_mount() {
 
 
 	if [ "$method" = "multi_mount" ]
 	if [ "$method" = "multi_mount" ]
 	then
 	then
-		echo /bin/true
+		echo true
 		return
 		return
 	fi
 	fi
 
 

+ 3 - 3
dselect/methods/multicd/setup

@@ -282,7 +282,7 @@ then
 			response="$defaultnfsserver"
 			response="$defaultnfsserver"
 		fi
 		fi
 		if [ -z "$response" ]; then continue; fi
 		if [ -z "$response" ]; then continue; fi
-		if [ -x /usr/bin/rpcinfo ]
+		if [ -x "`which rpcinfo`" ]
 		then
 		then
 			if rpcinfo -u "$response" mountd >/dev/null
 			if rpcinfo -u "$response" mountd >/dev/null
 			then
 			then
@@ -290,7 +290,7 @@ then
 			else
 			else
 				echo "$response appears not to be an NFS server."
 				echo "$response appears not to be an NFS server."
 			fi
 			fi
-		elif [ -x /bin/ping ]
+		elif [ -x "`which ping`" ]
 		then
 		then
 			if ping -q -c 1 "$response" | grep -q ', 1 packets received'
 			if ping -q -c 1 "$response" | grep -q ', 1 packets received'
 			then
 			then
@@ -300,7 +300,7 @@ then
 			fi
 			fi
 		else
 		else
 			echo \
 			echo \
-"(I can't check that now because there is no /usr/bin/rpcinfo or /bin/ping.)"
+"(I can't check that now because there is no rpcinfo or ping.)"
 			nfsserver="$response"
 			nfsserver="$response"
 		fi
 		fi
 	done
 	done

+ 3 - 3
scripts/Dpkg/Source/Package.pm

@@ -44,7 +44,7 @@ use Dpkg::Checksums;
 use Dpkg::Version;
 use Dpkg::Version;
 use Dpkg::Compression;
 use Dpkg::Compression;
 use Dpkg::Exit;
 use Dpkg::Exit;
-use Dpkg::Path qw(check_files_are_the_same);
+use Dpkg::Path qw(check_files_are_the_same find_command);
 use Dpkg::IPC;
 use Dpkg::IPC;
 use Dpkg::Vendor qw(run_vendor_hook);
 use Dpkg::Vendor qw(run_vendor_hook);
 
 
@@ -342,9 +342,9 @@ sub check_signature {
     my ($self) = @_;
     my ($self) = @_;
     my $dsc = $self->get_filename();
     my $dsc = $self->get_filename();
     my @exec;
     my @exec;
-    if (-x '/usr/bin/gpgv') {
+    if (find_command('gpgv')) {
         push @exec, "gpgv";
         push @exec, "gpgv";
-    } elsif (-x '/usr/bin/gpg') {
+    } elsif (find_command('gpg') {
         push @exec, "gpg", "--no-default-keyring", "-q", "--verify";
         push @exec, "gpg", "--no-default-keyring", "-q", "--verify";
     }
     }
     if (scalar(@exec)) {
     if (scalar(@exec)) {

+ 2 - 1
scripts/Dpkg/Vendor/Ubuntu.pm

@@ -26,6 +26,7 @@ our $VERSION = "0.01";
 
 
 use Dpkg::ErrorHandling;
 use Dpkg::ErrorHandling;
 use Dpkg::Gettext;
 use Dpkg::Gettext;
+use Dpkg::Path qw(find_command);
 use Dpkg::Control::Types;
 use Dpkg::Control::Types;
 use Dpkg::BuildOptions;
 use Dpkg::BuildOptions;
 use Dpkg::Arch qw(debarch_eq get_host_arch);
 use Dpkg::Arch qw(debarch_eq get_host_arch);
@@ -119,7 +120,7 @@ sub run_hook {
 	if (defined $hardening) {
 	if (defined $hardening) {
 	    my $flag = 'DEB_BUILD_HARDENING';
 	    my $flag = 'DEB_BUILD_HARDENING';
 	    if ($hardening ne "0") {
 	    if ($hardening ne "0") {
-		if (! -x '/usr/bin/hardened-cc') {
+		if (!find_command('hardened-cc')) {
 		    syserr(_g("'hardening' flag found but 'hardening-wrapper' not installed"));
 		    syserr(_g("'hardening' flag found but 'hardening-wrapper' not installed"));
 		}
 		}
 		if ($hardening ne "1") {
 		if ($hardening ne "1") {

+ 2 - 2
scripts/dpkg-gensymbols.pl

@@ -27,7 +27,7 @@ use Dpkg::Gettext;
 use Dpkg::ErrorHandling;
 use Dpkg::ErrorHandling;
 use Dpkg::Control::Info;
 use Dpkg::Control::Info;
 use Dpkg::Changelog::Parse;
 use Dpkg::Changelog::Parse;
-use Dpkg::Path qw(check_files_are_the_same);
+use Dpkg::Path qw(check_files_are_the_same find_command);
 
 
 textdomain("dpkg-dev");
 textdomain("dpkg-dev");
 
 
@@ -306,7 +306,7 @@ unless ($quiet) {
 	my $diff_label = sprintf("%s (%s_%s_%s)",
 	my $diff_label = sprintf("%s (%s_%s_%s)",
 	($ref_symfile->{file}) ? $ref_symfile->{file} : "new_symbol_file",
 	($ref_symfile->{file}) ? $ref_symfile->{file} : "new_symbol_file",
 	$oppackage, $sourceversion, $host_arch);
 	$oppackage, $sourceversion, $host_arch);
-	system("diff", "-u", "-L", $diff_label, $a, $b) if -x "/usr/bin/diff";
+	system("diff", "-u", "-L", $diff_label, $a, $b) if find_command("diff");
     }
     }
 }
 }
 exit($exitcode);
 exit($exitcode);

+ 47 - 37
utils/t/100_update_alternatives.t

@@ -14,6 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 use Dpkg::IPC;
 use Dpkg::IPC;
+use Dpkg::Path qw(find_command);
 use File::Spec;
 use File::Spec;
 use Test::More;
 use Test::More;
 
 
@@ -28,6 +29,15 @@ my $bindir = File::Spec->rel2abs("$tmpdir/bin");
 my @ua = ("$ENV{builddir}/update-alternatives", "--log", "/dev/null",
 my @ua = ("$ENV{builddir}/update-alternatives", "--log", "/dev/null",
           "--quiet", "--admindir", "$admindir", "--altdir", "$altdir");
           "--quiet", "--admindir", "$admindir", "--altdir", "$altdir");
 
 
+my %paths = (
+    true => find_command("true"),
+    false => find_command("false"),
+    yes => find_command("yes"),
+    cat => find_command("cat"),
+    date => find_command("date"),
+    sleep => find_command("sleep"),
+);
+
 if (! -x "$ENV{builddir}/update-alternatives") {
 if (! -x "$ENV{builddir}/update-alternatives") {
     plan skip_all => "update-alternatives not available";
     plan skip_all => "update-alternatives not available";
     exit(0);
     exit(0);
@@ -37,44 +47,44 @@ my $main_link = "$bindir/generic-test";
 my $main_name = "generic-test";
 my $main_name = "generic-test";
 my @choices = (
 my @choices = (
     {
     {
-	path => "/bin/true",
+	path => $paths{true},
 	priority => 20,
 	priority => 20,
 	slaves => [
 	slaves => [
 	    {
 	    {
 		"link" => "$bindir/slave2",
 		"link" => "$bindir/slave2",
 		name => "slave2",
 		name => "slave2",
-		path => "/bin/cat",
+		path => $paths{cat},
 	    },
 	    },
 	    {
 	    {
 		"link" => "$bindir/slave3",
 		"link" => "$bindir/slave3",
 		name => "slave3",
 		name => "slave3",
-		path => "/bin/cat",
+		path => $paths{cat},
 	    },
 	    },
 	    {
 	    {
 		"link" => "$bindir/slave1",
 		"link" => "$bindir/slave1",
 		name => "slave1",
 		name => "slave1",
-		path => "/usr/bin/yes",
+		path => $paths{yes},
 	    },
 	    },
 	    {
 	    {
 		"link" => "$bindir/slave4",
 		"link" => "$bindir/slave4",
 		name => "slave4",
 		name => "slave4",
-		path => "/bin/cat",
+		path => $paths{cat},
 	    },
 	    },
 	],
 	],
     },
     },
     {
     {
-        path => "/bin/false",
+        path => $paths{false},
         priority => 10,
         priority => 10,
         slaves => [
         slaves => [
 	    {
 	    {
 		"link" => "$bindir/slave1",
 		"link" => "$bindir/slave1",
 		name => "slave1",
 		name => "slave1",
-		path => "/bin/date",
+		path => $paths{date},
 	    },
 	    },
         ],
         ],
     },
     },
     {
     {
-        path => "/bin/sleep",
+        path => $paths{sleep},
         priority => 5,
         priority => 5,
         slaves => [],
         slaves => [],
     },
     },
@@ -262,35 +272,35 @@ $bindir/slave3
 slave4
 slave4
 $bindir/slave4
 $bindir/slave4
 
 
-/bin/false
+$paths{false}
 10
 10
-/bin/date
+$paths{date}
 
 
 
 
 
 
-/bin/sleep
+$paths{sleep}
 5
 5
 
 
 
 
 
 
 
 
-/bin/true
+$paths{true}
 20
 20
-/usr/bin/yes
-/bin/cat
-/bin/cat
-/bin/cat
+$paths{yes}
+$paths{cat}
+$paths{cat}
+$paths{cat}
 
 
 ", "administrative file is as expected");
 ", "administrative file is as expected");
 }
 }
 
 
 # manual change with --set-selections
 # manual change with --set-selections
-my $input = "doesntexist auto /bin/date\ngeneric-test manual /bin/false\n";
+my $input = "doesntexist auto $paths{date}\ngeneric-test manual $paths{false}\n";
 my $output = "";
 my $output = "";
 call_ua(["--set-selections"], from_string => \$input,
 call_ua(["--set-selections"], from_string => \$input,
         to_string => \$output, test_id => "manual update with --set-selections");
         to_string => \$output, test_id => "manual update with --set-selections");
 check_choice(1, "manual", "manual update with --set-selections");
 check_choice(1, "manual", "manual update with --set-selections");
-$input = "generic-test auto /bin/true\n";
+$input = "generic-test auto $paths{true}\n";
 call_ua(["--set-selections"], from_string => \$input,
 call_ua(["--set-selections"], from_string => \$input,
         to_string => \$output, test_id => "auto update with --set-selections");
         to_string => \$output, test_id => "auto update with --set-selections");
 check_choice(0, "auto", "auto update with --set-selections");
 check_choice(0, "auto", "auto update with --set-selections");
@@ -365,7 +375,7 @@ check_no_link($old_slave, "rename lost file");
 # update of alternative with many slaves not currently installed
 # update of alternative with many slaves not currently installed
 # and the link of the renamed slave exists while it should not
 # and the link of the renamed slave exists while it should not
 set_choice(1);
 set_choice(1);
-symlink("/bin/cat", "$bindir/generic-slave-bis");
+symlink("$paths{cat}", "$bindir/generic-slave-bis");
 $choices[0]{"slaves"}[0]{"link"} = "$bindir/slave2";
 $choices[0]{"slaves"}[0]{"link"} = "$bindir/slave2";
 install_choice(0, test_id => "update with non-installed slaves");
 install_choice(0, test_id => "update with non-installed slaves");
 check_no_link("$bindir/generic-slave-bis",
 check_no_link("$bindir/generic-slave-bis",
@@ -384,30 +394,30 @@ install_choice(0, error_to_file => "/dev/null", expect_failure => 1);
 cleanup();
 cleanup();
 install_choice(0);
 install_choice(0);
 # try to install a slave alternative as new master
 # try to install a slave alternative as new master
-call_ua(["--install", "$bindir/testmaster", "slave1", "/bin/date", "10"],
+call_ua(["--install", "$bindir/testmaster", "slave1", "$paths{date}", "10"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # try to install a master alternative as slave
 # try to install a master alternative as slave
-call_ua(["--install", "$bindir/testmaster", "testmaster", "/bin/date", "10",
-	 "--slave", "$bindir/testslave", "generic-test", "/bin/true" ],
+call_ua(["--install", "$bindir/testmaster", "testmaster", "$paths{date}", "10",
+	 "--slave", "$bindir/testslave", "generic-test", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # try to reuse master link in slave
 # try to reuse master link in slave
-call_ua(["--install", "$bindir/testmaster", "testmaster", "/bin/date", "10",
-	 "--slave", "$bindir/testmaster", "testslave", "/bin/true" ],
+call_ua(["--install", "$bindir/testmaster", "testmaster", "$paths{date}", "10",
+	 "--slave", "$bindir/testmaster", "testslave", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # try to reuse links in master alternative
 # try to reuse links in master alternative
-call_ua(["--install", "$bindir/slave1", "testmaster", "/bin/date", "10"],
+call_ua(["--install", "$bindir/slave1", "testmaster", "$paths{date}", "10"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # try to reuse links in slave alternative
 # try to reuse links in slave alternative
-call_ua(["--install", "$bindir/testmaster", "testmaster", "/bin/date", "10",
-	 "--slave", "$bindir/generic-test", "testslave", "/bin/true" ],
+call_ua(["--install", "$bindir/testmaster", "testmaster", "$paths{date}", "10",
+	 "--slave", "$bindir/generic-test", "testslave", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # try to reuse slave link in another slave alternative of another choice of
 # try to reuse slave link in another slave alternative of another choice of
 # the same main alternative
 # the same main alternative
-call_ua(["--install", $main_link, $main_name, "/bin/date", "10",
-	 "--slave", "$bindir/slave1", "testslave", "/bin/true" ],
+call_ua(["--install", $main_link, $main_name, "$paths{date}", "10",
+	 "--slave", "$bindir/slave1", "testslave", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # lack of absolute filenames in links or file path, non-existing path,
 # lack of absolute filenames in links or file path, non-existing path,
-call_ua(["--install", "../testmaster", "testmaster", "/bin/date", "10"],
+call_ua(["--install", "../testmaster", "testmaster", "$paths{date}", "10"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 call_ua(["--install", "$bindir/testmaster", "testmaster", "./update-alternatives.pl", "10"],
 call_ua(["--install", "$bindir/testmaster", "testmaster", "./update-alternatives.pl", "10"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
@@ -415,18 +425,18 @@ call_ua(["--install", "$bindir/testmaster", "testmaster", "./update-alternatives
 call_ua(["--install", "$bindir/testmaster", "testmaster", "$bindir/doesntexist", "10"],
 call_ua(["--install", "$bindir/testmaster", "testmaster", "$bindir/doesntexist", "10"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # invalid alternative name in master
 # invalid alternative name in master
-call_ua(["--install", "$bindir/testmaster", "test/master", "/bin/date", "10"],
+call_ua(["--install", "$bindir/testmaster", "test/master", "$paths{date}", "10"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # invalid alternative name in slave
 # invalid alternative name in slave
-call_ua(["--install", "$bindir/testmaster", "testmaster", "/bin/date", "10",
-	 "--slave", "$bindir/testslave", "test slave", "/bin/true" ],
+call_ua(["--install", "$bindir/testmaster", "testmaster", "$paths{date}", "10",
+	 "--slave", "$bindir/testslave", "test slave", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # install in non-existing dir should fail
 # install in non-existing dir should fail
-call_ua(["--install", "$bindir/doesntexist/testmaster", "testmaster", "/bin/date", "10",
-	 "--slave", "$bindir/testslave", "testslave", "/bin/true" ],
+call_ua(["--install", "$bindir/doesntexist/testmaster", "testmaster", "$paths{date}", "10",
+	 "--slave", "$bindir/testslave", "testslave", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
-call_ua(["--install", "$bindir/testmaster", "testmaster", "/bin/date", "10",
-	 "--slave", "$bindir/doesntexist/testslave", "testslave", "/bin/true" ],
+call_ua(["--install", "$bindir/testmaster", "testmaster", "$paths{date}", "10",
+	 "--slave", "$bindir/doesntexist/testslave", "testslave", "$paths{true}" ],
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 	expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 
 
 # non-existing alternative path in slave is not a failure
 # non-existing alternative path in slave is not a failure