Przeglądaj źródła

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 lat temu
rodzic
commit
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
   * 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.
+  * Do not use absolute paths for programs in perl and shell code.
 
   [ Raphaël Hertzog ]
   * 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 {
   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') {
     system('gzip -dc /usr/lib/dpkg/methods/ftp/README.mirrors.txt.gz | pager');
   } else {

+ 3 - 3
dselect/methods/disk/setup

@@ -241,7 +241,7 @@ then
 			response="$defaultnfsserver"
 		fi
 		if [ -z "$response" ]; then continue; fi
-		if [ -x /usr/bin/rpcinfo ]
+		if [ -x "`which rpcinfo`" ]
 		then
 			if rpcinfo -u "$response" mountd | grep -q 'ready'
 			then
@@ -249,7 +249,7 @@ then
 			else
 				echo "$response appears not to be an NFS server."
 			fi
-		elif [ -x /bin/ping ]
+		elif [ -x "`which ping`" ]
 		then
 			if ping -q -c 1 "$response" | grep -q ', 1 packets received'
 			then
@@ -259,7 +259,7 @@ then
 			fi
 		else
 			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"
 		fi
 	done

+ 1 - 1
dselect/methods/ftp/install

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

+ 2 - 2
dselect/methods/multicd/install

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

+ 3 - 3
dselect/methods/multicd/setup

@@ -282,7 +282,7 @@ then
 			response="$defaultnfsserver"
 		fi
 		if [ -z "$response" ]; then continue; fi
-		if [ -x /usr/bin/rpcinfo ]
+		if [ -x "`which rpcinfo`" ]
 		then
 			if rpcinfo -u "$response" mountd >/dev/null
 			then
@@ -290,7 +290,7 @@ then
 			else
 				echo "$response appears not to be an NFS server."
 			fi
-		elif [ -x /bin/ping ]
+		elif [ -x "`which ping`" ]
 		then
 			if ping -q -c 1 "$response" | grep -q ', 1 packets received'
 			then
@@ -300,7 +300,7 @@ then
 			fi
 		else
 			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"
 		fi
 	done

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

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

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

@@ -26,6 +26,7 @@ our $VERSION = "0.01";
 
 use Dpkg::ErrorHandling;
 use Dpkg::Gettext;
+use Dpkg::Path qw(find_command);
 use Dpkg::Control::Types;
 use Dpkg::BuildOptions;
 use Dpkg::Arch qw(debarch_eq get_host_arch);
@@ -119,7 +120,7 @@ sub run_hook {
 	if (defined $hardening) {
 	    my $flag = 'DEB_BUILD_HARDENING';
 	    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"));
 		}
 		if ($hardening ne "1") {

+ 2 - 2
scripts/dpkg-gensymbols.pl

@@ -27,7 +27,7 @@ use Dpkg::Gettext;
 use Dpkg::ErrorHandling;
 use Dpkg::Control::Info;
 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");
 
@@ -306,7 +306,7 @@ unless ($quiet) {
 	my $diff_label = sprintf("%s (%s_%s_%s)",
 	($ref_symfile->{file}) ? $ref_symfile->{file} : "new_symbol_file",
 	$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);

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

@@ -14,6 +14,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 use Dpkg::IPC;
+use Dpkg::Path qw(find_command);
 use File::Spec;
 use Test::More;
 
@@ -28,6 +29,15 @@ my $bindir = File::Spec->rel2abs("$tmpdir/bin");
 my @ua = ("$ENV{builddir}/update-alternatives", "--log", "/dev/null",
           "--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") {
     plan skip_all => "update-alternatives not available";
     exit(0);
@@ -37,44 +47,44 @@ my $main_link = "$bindir/generic-test";
 my $main_name = "generic-test";
 my @choices = (
     {
-	path => "/bin/true",
+	path => $paths{true},
 	priority => 20,
 	slaves => [
 	    {
 		"link" => "$bindir/slave2",
 		name => "slave2",
-		path => "/bin/cat",
+		path => $paths{cat},
 	    },
 	    {
 		"link" => "$bindir/slave3",
 		name => "slave3",
-		path => "/bin/cat",
+		path => $paths{cat},
 	    },
 	    {
 		"link" => "$bindir/slave1",
 		name => "slave1",
-		path => "/usr/bin/yes",
+		path => $paths{yes},
 	    },
 	    {
 		"link" => "$bindir/slave4",
 		name => "slave4",
-		path => "/bin/cat",
+		path => $paths{cat},
 	    },
 	],
     },
     {
-        path => "/bin/false",
+        path => $paths{false},
         priority => 10,
         slaves => [
 	    {
 		"link" => "$bindir/slave1",
 		name => "slave1",
-		path => "/bin/date",
+		path => $paths{date},
 	    },
         ],
     },
     {
-        path => "/bin/sleep",
+        path => $paths{sleep},
         priority => 5,
         slaves => [],
     },
@@ -262,35 +272,35 @@ $bindir/slave3
 slave4
 $bindir/slave4
 
-/bin/false
+$paths{false}
 10
-/bin/date
+$paths{date}
 
 
 
-/bin/sleep
+$paths{sleep}
 5
 
 
 
 
-/bin/true
+$paths{true}
 20
-/usr/bin/yes
-/bin/cat
-/bin/cat
-/bin/cat
+$paths{yes}
+$paths{cat}
+$paths{cat}
+$paths{cat}
 
 ", "administrative file is as expected");
 }
 
 # 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 = "";
 call_ua(["--set-selections"], from_string => \$input,
         to_string => \$output, test_id => "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,
         to_string => \$output, test_id => "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
 # and the link of the renamed slave exists while it should not
 set_choice(1);
-symlink("/bin/cat", "$bindir/generic-slave-bis");
+symlink("$paths{cat}", "$bindir/generic-slave-bis");
 $choices[0]{"slaves"}[0]{"link"} = "$bindir/slave2";
 install_choice(0, test_id => "update with non-installed slaves");
 check_no_link("$bindir/generic-slave-bis",
@@ -384,30 +394,30 @@ install_choice(0, error_to_file => "/dev/null", expect_failure => 1);
 cleanup();
 install_choice(0);
 # 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");
 # 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");
 # 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");
 # 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");
 # 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");
 # try to reuse slave link in another slave alternative of another choice of
 # 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");
 # 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");
 call_ua(["--install", "$bindir/testmaster", "testmaster", "./update-alternatives.pl", "10"],
         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"],
         expect_failure => 1, to_file => "/dev/null", error_to_file => "/dev/null");
 # 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");
 # 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");
 # 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");
-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");
 
 # non-existing alternative path in slave is not a failure