I've traced pdksh's behaviour back to ext2_permission() in fs/ext2/acl.c:
int ext2_permission (struct inode * inode, int mask)
{
unsigned short mode = inode->i_mode;
/*
* Nobody gets write access to an immutable file
*/
if ((mask & S_IWOTH) && IS_IMMUTABLE(inode))
return -EACCES;
/*
* Special case, access is always granted for root
*/
-----> if (fsuser())
-----> return 0;
/*
* If no ACL, checks using the file mode
*/
else if (current->fsuid == inode->i_uid)
mode >>= 6;
else if (in_group_p (inode->i_gid))
mode >>= 3;
if (((mode & mask & S_IRWXO) == mask))
return 0;
else
return -EACCES;
}
It seems to me that the exemption for root shouldn't apply if mask is
X_OK, rather it should return 0 only if the file is executable by anyone
and -EACCES otherwise.
Perhaps (untested):
if (fsuser())
/* S_IXOTH really should be X_OK but that doesn't seem to be
visible here */
if (mask == S_IXOTH && !(mode & S_IXUGO))
return -EACCESS;
else
return 0;
Does this make sense, or is there a reason for the current behaviour?
Wes