Skip to content

Commit 51393fc

Browse files
author
Abigail
committed
Fix bug #68260
File::Find was not resolving paths of the form "/..////../" correctly. Fixed by adding a quantifier to the substitution parameter in contract_name().
1 parent d521341 commit 51393fc

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

lib/File/Find.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ sub contract_name {
448448
my $abs_name= $cdir . $fn;
449449

450450
if (substr($fn,0,3) eq '../') {
451-
1 while $abs_name =~ s!/[^/]*/\.\./!/!;
451+
1 while $abs_name =~ s!/[^/]*/\.\./+!/!;
452452
}
453453

454454
return $abs_name;

lib/File/Find/t/find.t

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,17 @@ sub cleanup {
9595
file_path('fa', 'faa', 'faa_ord'),
9696
file_path('fa', 'fab', 'fab_ord'),
9797
file_path('fa', 'fab', 'faba', 'faba_ord'),
98+
file_path('fa', 'fac', 'faca'),
9899
file_path('fb', 'fb_ord'),
99-
file_path('fb', 'fba', 'fba_ord');
100+
file_path('fb', 'fba', 'fba_ord'),
101+
file_path('fb', 'fbc', 'fbca');
100102
rmdir dir_path('fa', 'faa');
101103
rmdir dir_path('fa', 'fab', 'faba');
102104
rmdir dir_path('fa', 'fab');
105+
rmdir dir_path('fa', 'fac');
103106
rmdir dir_path('fa');
104107
rmdir dir_path('fb', 'fba');
108+
rmdir dir_path('fb', 'fbc');
105109
rmdir dir_path('fb');
106110
}
107111
if ($need_updir) {
@@ -893,3 +897,36 @@ if ($^O eq 'MSWin32') {
893897
File::Find::find( {wanted => \&wanted_File_Dir, no_chdir => 1}, $volume . topdir('fa'));
894898
Check( scalar(keys %Expect_File) == 0 );
895899
}
900+
901+
902+
if ($symlink_exists) { # Issue 68260
903+
print "# BUG 68260\n";
904+
MkDir (dir_path ('fa', 'fac'), 0770);
905+
MkDir (dir_path ('fb', 'fbc'), 0770);
906+
touch (file_path ('fa', 'fac', 'faca'));
907+
if ($^O eq 'MacOS') {
908+
CheckDie (symlink ('..::::..:fa:fac:faca', 'fb:fbc:fbca'));
909+
}
910+
else {
911+
CheckDie (symlink ('..////../fa/fac/faca', 'fb/fbc/fbca'));
912+
}
913+
914+
use warnings;
915+
my $dangling_symlink;
916+
local $SIG {__WARN__} = sub {
917+
local $" = " ";
918+
$dangling_symlink ++ if "@_" =~ /dangling symbolic link/;
919+
};
920+
921+
File::Find::find (
922+
{
923+
wanted => sub {1;},
924+
follow => 1,
925+
follow_skip => 2,
926+
dangling_symlinks => 1,
927+
},
928+
File::Spec -> curdir
929+
);
930+
931+
Check (!$dangling_symlink);
932+
}

0 commit comments

Comments
 (0)