summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/File/stat.pm19
-rw-r--r--pod/perldelta.pod11
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