diff options
author | Denis Barbier <barbier> | 2002-03-11 22:29:48 +0000 |
---|---|---|
committer | Denis Barbier <barbier> | 2002-03-11 22:29:48 +0000 |
commit | daf05d498d57b420f84a342295337e2c74f320d1 (patch) | |
tree | f32c11db6f6209c034156d1a8b20aab4fc63d6be /Perl | |
parent | 8831879ce19aae0ae7fcbabd2964c07f39343692 (diff) |
With GNU extensions for long filenames, some dummy filename could have a
trailing slash, in which case it was considered as a directory.
CVS version numbers
Perl/Local/Inside/Tar.pm: 1.3 -> 1.4
Diffstat (limited to 'Perl')
-rw-r--r-- | Perl/Local/Inside/Tar.pm | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/Perl/Local/Inside/Tar.pm b/Perl/Local/Inside/Tar.pm index 5541b874bfe..d4c3f2780b8 100644 --- a/Perl/Local/Inside/Tar.pm +++ b/Perl/Local/Inside/Tar.pm @@ -259,7 +259,7 @@ sub _read_firsttime { my ($block, $data, $maxlength, $numbytes, $offset); - my ($name, $type, $size) = $self->_read_header() or return 0; + my ($name, $type, $size) = $self->_read_header(0) or return 0; my $path = ''; $offset = $self->{offset}; @@ -326,6 +326,7 @@ sub _read_firsttime { sub _read_header { my $self = shift; + my $cont = shift; # 1 when reading long filenames, 0 otherwise # Read header my $head = $self->_io_read(512, 1) || @@ -364,7 +365,7 @@ sub _read_header { Carp::croak "End of file found when reading \`$self->{name}'"; $self->_io_read(($size & ~0x01ff) + 512 - $size) if ($size & 0x01ff); - ($name, $type, $size) = $self->_read_header() or return 0; + ($name, $type, $size) = $self->_read_header(1) or return 0; $name = $realname; } @@ -406,7 +407,8 @@ sub _read_header { } } - $type = "dir" if $name =~ m|/$| and $type eq "file"; + # Fix broken archives + $type = "dir" if $name =~ m|/$| and $type eq "file" and !$cont; return ($name, $type, $size); } |