aboutsummaryrefslogtreecommitdiffstats
path: root/Perl
diff options
context:
space:
mode:
authorDenis Barbier <barbier>2002-03-11 22:29:48 +0000
committerDenis Barbier <barbier>2002-03-11 22:29:48 +0000
commitdaf05d498d57b420f84a342295337e2c74f320d1 (patch)
treef32c11db6f6209c034156d1a8b20aab4fc63d6be /Perl
parent8831879ce19aae0ae7fcbabd2964c07f39343692 (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.pm8
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);
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy