Package: moreutils
Version: 0.33
Severity: important
Tags: patch

If you run vipe with empty input, it aborts:
  $ echo -n | vipe
  write temp:  at /usr/bin/vipe line 46, <STDIN> chunk 1.

The line in question is:
  print $fh <STDIN> || die "write temp: $!";
Perl parses this as
  print $fh (<STDIN> || die "write temp: $!");
which is not what was intended.

This is why perlop(1) recommends using the lower-precendence or operator for control flow. The attached patch replaces "|| die" with "or die" everywhere, fixing this problem.
From 4159ef570f21193a4bd27db2fc636fd2214f99c4 Mon Sep 17 00:00:00 2001
From: Anders Kaseorg <ande...@mit.edu>
Date: Thu, 11 Dec 2008 14:36:36 -0500
Subject: [PATCH] Replace "|| die" with "or die".

Previously vipe would abort on empty input, because Perl parses
  print $fh <STDIN> || die "write temp: $!";
as
  print $fh (<STDIN> || die "write temp: $!");

This is fixed by using the low-precendence or operator for control
flow.

Signed-off-by: Anders Kaseorg <ande...@mit.edu>
---
 combine |    2 +-
 ts      |    2 +-
 vidir   |   12 ++++++------
 vipe    |   12 ++++++------
 4 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/combine b/combine
index a695935..dec415f 100755
--- a/combine
+++ b/combine
@@ -79,7 +79,7 @@ sub filemap {
 	my $file=shift;
 	my $sub=shift;
 
-	open (IN, $file) || die "$file: $!\n";
+	open (IN, $file) or die "$file: $!\n";
 	while (<IN>) {
 		chomp;
 		$sub->();
diff --git a/ts b/ts
index ca150b4..dabde0b 100755
--- a/ts
+++ b/ts
@@ -46,7 +46,7 @@ $|=1;
 
 my $rel=0;
 use Getopt::Long;
-GetOptions("r" => \$rel) || die "usage: ts [-r] [format]\n";
+GetOptions("r" => \$rel) or die "usage: ts [-r] [format]\n";
 
 if ($rel) {
 	eval q{
diff --git a/vidir b/vidir
index a77739f..8fa96e8 100755
--- a/vidir
+++ b/vidir
@@ -95,11 +95,11 @@ foreach my $item (@ARGV) {
 	if ($item eq "-") {
 		push @dir, map { chomp; $_ } <STDIN>;
 		close STDIN;
-		open(STDIN, "/dev/tty") || die "reopen: $!\n";
+		open(STDIN, "/dev/tty") or die "reopen: $!\n";
 	}
 	elsif (-d $item) {
 		$item =~ s{/?$}{/};
-		opendir(DIR, $item) || die "$0: cannot read $item: $!\n";
+		opendir(DIR, $item) or die "$0: cannot read $item: $!\n";
 		push @dir, map { "$item$_" } sort readdir(DIR);
 		closedir DIR;
 	}
@@ -113,7 +113,7 @@ if (grep(/[[:cntrl:]]/, @dir)) {
 }
 
 my $tmp=File::Temp->new(TEMPLATE => "dirXXXXX", DIR => File::Spec->tmpdir);
-open (OUT, ">".$tmp->filename) || die "$0: cannot create ".$tmp->filename.": $!\n";
+open (OUT, ">".$tmp->filename) or die "$0: cannot create ".$tmp->filename.": $!\n";
 
 my %item;
 my $c=0;
@@ -123,7 +123,7 @@ foreach (@dir) {
 	print OUT "$c\t$_\n";
 }
 @dir=();
-close OUT || die "$0: cannot write ".$tmp->filename.": $!\n";
+close OUT or die "$0: cannot write ".$tmp->filename.": $!\n";
 
 my @editor="vi";
 if (-x "/usr/bin/editor") {
@@ -140,7 +140,7 @@ if ($ret != 0) {
 	die "@editor exited nonzero, aborting\n";
 }
 
-open (IN, $tmp->filename) || die "$0: cannot read ".$tmp->filename.": $!\n";
+open (IN, $tmp->filename) or die "$0: cannot read ".$tmp->filename.": $!\n";
 while (<IN>) {
 	chomp;
 	if (/^(\d+)\t{0,1}(.*)/) {
@@ -205,7 +205,7 @@ while (<IN>) {
 		die "$0: unable to parse line \"$_\", aborting\n";
 	}
 }
-close IN || die "$0: cannot read ".$tmp->filename.": $!\n";
+close IN or die "$0: cannot read ".$tmp->filename.": $!\n";
 unlink($tmp.'~') if -e $tmp.'~';
 
 sub rm {
diff --git a/vipe b/vipe
index 8cee2b1..8bc3587 100755
--- a/vipe
+++ b/vipe
@@ -43,13 +43,13 @@ $/=undef;
 
 my ($fh, $tmp)=tempfile();
 die "cannot create tempfile" unless $fh;
-print $fh <STDIN> || die "write temp: $!";
+print $fh <STDIN> or die "write temp: $!";
 close $fh;
 close STDIN;
-open(STDIN, "</dev/tty") || die "reopen stdin: $!";
-open(OUT, ">&STDOUT") || die "save stdout: $!";
+open(STDIN, "</dev/tty") or die "reopen stdin: $!";
+open(OUT, ">&STDOUT") or die "save stdout: $!";
 close STDOUT;
-open(STDOUT, ">/dev/tty") || die "reopen stdout: $!";
+open(STDOUT, ">/dev/tty") or die "reopen stdout: $!";
 
 my @editor="vi";
 if (-x "/usr/bin/editor") {
@@ -66,7 +66,7 @@ if ($ret != 0) {
 	die "@editor exited nonzero, aborting\n";
 }
 
-open (IN, $tmp) || die "$0: cannot read $tmp: $!\n";
-print OUT <IN> || die "write failure: $!";
+open (IN, $tmp) or die "$0: cannot read $tmp: $!\n";
+print OUT <IN> or die "write failure: $!";
 close IN;
 unlink($tmp);
-- 
1.6.0.4

Reply via email to