From 5df0446abcca8ca3d65af14f05808c87d3de5b7f Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 27 Sep 2023 06:02:49 +0000 Subject: lei: don't gzip --rsyncable by default for mbox* Using and memoizing the usability of `--rsyncable' is unsafe since pigz (or GNU gzip) can be uninstalled and leave a user with a non-rsync-aware gzip implementation in the long-running daemon. So we stop passing --rsyncable by default to pigz/gzip and no longer attempt to check for it (since it was a TOCTTOU error, anyways). Specifying --rsyncable explicitly didn't work, either, and ended up passing `1' to the gzip/pigz argv :x Finally, we now test --rsyncable on the CLI by adding support for it in `lei convert' and testing it in t/lei-convert.t --- lib/PublicInbox/MboxReader.pm | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) (limited to 'lib/PublicInbox/MboxReader.pm') diff --git a/lib/PublicInbox/MboxReader.pm b/lib/PublicInbox/MboxReader.pm index beffabe8..e4209022 100644 --- a/lib/PublicInbox/MboxReader.pm +++ b/lib/PublicInbox/MboxReader.pm @@ -1,10 +1,10 @@ -# Copyright (C) 2020-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ -# reader for mbox variants we support +# reader for mbox variants we support (and also sets up commands for writing) package PublicInbox::MboxReader; use strict; -use v5.10.1; +use v5.10.1; # check regexps before v5.12 use Data::Dumper; $Data::Dumper::Useqq = 1; # should've been the default, for bad data @@ -141,10 +141,9 @@ sub reads { # all of these support -c for stdout and -d for decompression, # mutt is commonly distributed with hooks for gz, bz2 and xz, at least -# { foo => '' } means "--foo" is passed to the command-line, -# otherwise { foo => '--bar' } passes "--bar" +# { foo => '' } means "--foo" is passed to the command-line my %zsfx2cmd = ( - gz => [ qw(GZIP pigz gzip) ], + gz => [ qw(GZIP pigz gzip), { rsyncable => '' } ], bz2 => [ 'bzip2', {} ], xz => [ 'xz', {} ], # don't add new entries here unless MUA support is widely available @@ -173,28 +172,9 @@ sub zsfx2cmd ($$$) { } $cmd[0] // die join(' or ', @info)." missing for .$zsfx"; - # not all gzip support --rsyncable, FreeBSD gzip doesn't even exit - # with an error code - if (!$decompress && $cmd[0] =~ m!/gzip\z! && !defined($cmd_opt)) { - pipe(my ($r, $w)) or die "pipe: $!"; - open my $null, '+>', '/dev/null' or die "open: $!"; - my $rdr = { 0 => $null, 1 => $null, 2 => $w }; - my $tst = [ $cmd[0], '--rsyncable' ]; - my $pid = PublicInbox::Spawn::spawn($tst, undef, $rdr); - close $w; - my $err = do { local $/; <$r> }; - waitpid($pid, 0) == $pid or die "BUG: waitpid: $!"; - $cmd_opt = $err ? {} : { rsyncable => '' }; - push(@$x, $cmd_opt); - } - for my $bool (keys %$cmd_opt) { - my $switch = $cmd_opt->{$bool} // next; - push @cmd, '--'.($switch || $bool); - } - for my $key (qw(rsyncable)) { # support compression level? - my $switch = $cmd_opt->{$key} // next; - my $val = $lei->{opt}->{$key} // next; - push @cmd, $switch, $val; + # only for --rsyncable. TODO: support compression level? + for my $key (keys %$cmd_opt) { + push @cmd, '--'.$key if $lei->{opt}->{$key}; } \@cmd; } -- cgit v1.2.3-24-ge0c7