1 2use strict; 3use warnings; 4 5use Test::More tests => 6; 6use File::Path qw(rmtree mkpath); 7use Cwd; 8 9my $n = 0; 10sub create_file { 11 my $fn = shift; 12 13 $n++; 14 (my $dir = $fn) =~ s,/[^/]+$,,; 15 mkpath $dir; 16 open my $fd, ">", $fn or die "$fn: $!"; 17 print $fd "file $n\n"; 18} 19 20 21ustar_pathnames: { SKIP: { 22 # Prove that pax breaks up ustar pathnames properly 23 24 my $top = getcwd . "/ustar-pathnames-1"; 25 skip "Current path is too long", 6 if length $top > 92; 26 rmtree $top; 27 my $subdir = "x" . "x" x (92 - length $top); 28 my $work94 = "$top/$subdir"; 29 mkpath $work94; # $work is 94 characters long 30 31 my $x49 = "x" x 49; 32 my $x50 = "x" x 50; 33 my $x60 = "x" x 60; 34 my $x95 = "x" x 95; 35 36 my @paths = ( 37 "$work94/x099", # 99 chars 38 "$work94/xx100", # 100 chars 39 "$work94/xxx101", # 101 chars 40 "$work94/$x49/${x50}x199", # 199 chars 41 "$work94/$x49/${x50}xx200", # 200 chars 42 "$work94/$x49/${x50}xxx201", # 201 chars 43 "$work94/$x60/${x95}254", # 254 chars 44 "$work94/$x60/${x95}x255", # 255 chars 45 ); 46 47 my @l = map { length } @paths; 48 49 my $n = 0; 50 create_file $_ for @paths; 51 system "pax -wf ustar.ok $work94"; 52 ok($? == 0, "Wrote 'ustar.ok' containing files with lengths @l"); 53 54 (my $orig = $top) =~ s,1$,2,; 55 rmtree $orig; 56 rename $top, $orig; 57 58 system "pax -rf ustar.ok"; 59 ok($? == 0, "Restored 'ustar.ok' containing files with lengths @l"); 60 61 system "diff -ru $orig $top"; 62 ok($? == 0, "Restored files are identical"); 63 64 rmtree $top; 65 rename $orig, $top; 66 67 # 256 chars (with components < 100 chars) should not work 68 push @paths, "$work94/x$x60/${x95}x256"; # 256 chars 69 push @l, length $paths[-1]; 70 create_file $paths[-1]; 71 system "pax -wf ustar.fail1 $work94"; 72 ok($?, "Failed to write 'ustar.fail1' containing files with lengths @l"); 73 74 # Components with 100 chars shouldn't work 75 unlink $paths[-1]; 76 $paths[-1] = "$work94/${x95}xc100"; # 100 char filename 77 $l[-1] = length $paths[-1]; 78 create_file $paths[-1]; 79 system "pax -wf ustar.fail2 $work94"; 80 ok($?, "Failed to write 'ustar.fail2' with a 100 char filename"); 81 82 unlink $paths[-1]; 83 $paths[-1] = "$work94/${x95}xc100/x"; # 100 char component 84 $l[-1] = length $paths[-1]; 85 create_file $paths[-1]; 86 system "pax -wf ustar.fail3 $work94"; 87 ok($?, "Failed to write 'ustar.fail3' with a 100 char component"); 88}} 89