From: Kotresh HR Date: Fri, 16 Apr 2021 04:14:05 +0000 (+0530) Subject: client: Fix executeable access check for the root user X-Git-Tag: v17.1.0~2091^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b20ec2978cd3e16be9f45f1b7860bdae3c738147;p=ceph.git client: Fix executeable access check for the root user Executeable permission check always returned sucessful even when executeable bit is not set on any of the user, group or others. This patch fixes it by overiding executeable permission check for root only if one of the executeable bit is set Signed-off-by: Kotresh HR Fixes: https://tracker.ceph.com/issues/50060 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index f5e9ae933bce..1368bf8ea65a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -145,6 +145,10 @@ #define DEBUG_GETATTR_CAPS (CEPH_CAP_XATTR_SHARED) +#ifndef S_IXUGO +#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH) +#endif + using namespace TOPNSPC::common; namespace bs = boost::system; @@ -5597,8 +5601,12 @@ void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, const M int Client::inode_permission(Inode *in, const UserPerm& perms, unsigned want) { - if (perms.uid() == 0) + if (perms.uid() == 0) { + // Executable are overridable when there is at least one exec bit set + if((want & MAY_EXEC) && !(in->mode & S_IXUGO)) + return -CEPHFS_EACCES; return 0; + } if (perms.uid() != in->uid && (in->mode & S_IRWXG)) { int ret = _posix_acl_permission(in, perms, want);