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