http://www.perlmonks.org?node_id=11118250

sectokia has asked for the wisdom of the Perl Monks concerning the following question:

How do you get IO::Uncompress::Gunzip to error if the input file isn't a GZ file?

Say I have files like:

dd if=/dev/random of=test.random bs=64 count=1 dd if=/dev/zero of=test.zero bs=64 count=1 echo "hello world!" > hello.txt

And my test.pl script is:

use IO::Uncompress::Gunzip qw(gunzip $GunzipError); my $output; my $status = gunzip $ARGV[0] => \$output, Strict => 1 or die "Failed!" +; print $GunzipError; print $output;

Then...

test.pl test.random test.pl test.zero test.pl hello.txt

None of those will die or give error (well test.random will if you are really lucky...)

It seems to me that if the GZIP magic header is no present the input just copies to output instead of being error?

Replies are listed 'Best First'.
Re: How do you get IO::Uncompress::Gunzip to error if the input file isn't a GZ file?
by choroba (Cardinal) on Jun 19, 2020 at 06:39 UTC
    Set the Transparent option to 0:
    Transparent => 0|1
    If this option is set and the input file/buffer is not compressed data, the module will allow reading of it anyway.
    In addition, if the input file/buffer does contain compressed data and there is non-compressed data immediately following it, setting this option will make this module treat the whole file/buffer as a single data stream.
    This option defaults to 1.
    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
Re: How do you get IO::Uncompress::Gunzip to error if the input file isn't a GZ file?
by parv (Parson) on Jun 19, 2020 at 04:46 UTC
      You could use file(1) magic to check if a file is indeed a compressed file before trying to uncompress.

      ... but you should remember that this creates a TOCTTOU vulnerability. Also, magic checks check only for magic numbers, not for validity.

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)