diff options
-rw-r--r-- | lib/File/stat.pm | 19 | ||||
-rw-r--r-- | pod/perldelta.pod | 11 |
2 files changed, 23 insertions, 7 deletions
diff --git a/lib/File/stat.pm b/lib/File/stat.pm index 90d53d78e8..b631fbf875 100644 --- a/lib/File/stat.pm +++ b/lib/File/stat.pm @@ -10,7 +10,7 @@ BEGIN { *warnif = \&warnings::warnif } our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); -our $VERSION = '1.06'; +our $VERSION = '1.07'; my @fields; BEGIN { @@ -87,15 +87,22 @@ else { *cando = sub { my ($s, $mode, $eff) = @_; my $uid = $eff ? $> : $<; - - # If we're root on unix and we are not testing for executable - # status, then all file tests are true. - $^O ne "VMS" and $uid == 0 and !($mode & 0111) and return 1; - my ($stmode, $stuid, $stgid) = @$s[2,4,5]; # This code basically assumes that the rwx bits of the mode are # the 0777 bits, but so does Perl_cando. + + if ($uid == 0 && $^O ne "VMS") { + # If we're root on unix + # not testing for executable status => all file tests are true + return 1 if !($mode & 0111); + # testing for executable status => + # for a file, any x bit will do + # for a directory, always true + return 1 if $stmode & 0111 || S_ISDIR($stmode); + return ""; + } + if ($stuid == $uid) { $stmode & $mode and return 1; } diff --git a/pod/perldelta.pod b/pod/perldelta.pod index efc101becb..03d4bfb9f1 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -97,7 +97,16 @@ XXX =item * -L<XXX> has been upgraded from version 0.69 to version 0.70. +L<File::stat> has been upgraded from version 1.06 to 1.07. + +Previously C<File::stat>'s overloaded C<-x> and C<-X> operators did not give +the correct results for directories or executable files when running as +root. They had been treating executable permissions for root just like for +any other user, performing group membership tests I<etc> for files not owned +by root. They now follow the correct Unix behaviour - for a directory they +are always true, and for a file if any of the three execute permission bits +are set then they report that root can execute the file. Perl's builtin +C<-x> and C<-X> operators have always been correct. =back |