This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
correct error returns from fast_abs_path()
authorZefram <zefram@fysh.org>
Tue, 16 Jan 2018 05:16:41 +0000 (05:16 +0000)
committerZefram <zefram@fysh.org>
Tue, 16 Jan 2018 05:22:25 +0000 (05:22 +0000)
fast_abs_path() is documented as behaving like abs_path(), and is even
used as the main version of abs_path() on Cygwin, so it should indicate
errors in the same manner.  It was croaking; change this to return undef
with $! set.  Leave croaking for the error that breaks the abs_path()
rules, where fast_abs_path() has changed cwd and fails to change back.
Problem noted on [perl #132648].

dist/PathTools/Cwd.pm

index c648a57..451c69d 100644 (file)
@@ -462,6 +462,7 @@ my $Curdir;
 sub fast_abs_path {
     local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage
     my $cwd = getcwd();
+    defined $cwd or return undef;
     require File::Spec;
     my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir);
 
@@ -471,7 +472,9 @@ sub fast_abs_path {
     ($cwd)  = $cwd  =~ /(.*)/s;
 
     unless (-e $path) {
-       _croak("$path: No such file or directory");
+       require Errno;
+       $! = Errno::ENOENT();
+       return undef;
     }
 
     unless (-d _) {
@@ -482,7 +485,7 @@ sub fast_abs_path {
 
        if (-l $path) {
            my $link_target = readlink($path);
-           die "Can't resolve link $path: $!" unless defined $link_target;
+           defined $link_target or return undef;
            
            $link_target = File::Spec->catpath($vol, $dir, $link_target)
                 unless File::Spec->file_name_is_absolute($link_target);
@@ -496,7 +499,7 @@ sub fast_abs_path {
     }
 
     if (!CORE::chdir($path)) {
-       _croak("Cannot chdir to $path: $!");
+       return undef;
     }
     my $realpath = getcwd();
     if (! ((-d $cwd) && (CORE::chdir($cwd)))) {