]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: Fix executeable access check for the root user 41295/head
authorKotresh HR <khiremat@redhat.com>
Fri, 16 Apr 2021 04:14:05 +0000 (09:44 +0530)
committerKotresh HR <khiremat@redhat.com>
Wed, 19 May 2021 17:05:12 +0000 (22:35 +0530)
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 <khiremat@redhat.com>
Fixes: https://tracker.ceph.com/issues/50060
(cherry picked from commit b20ec2978cd3e16be9f45f1b7860bdae3c738147)

Conflicts:
  src/client/Client.cc: The commit 6aa78836548f (cephfs errno aliases) is not present in
octopus.

src/client/Client.cc

index 06254493ea50254ae7eea890d1ae96a9754e9b3c..525b1eafd2b97e48c2b45bd425513f55a51b323a 100755 (executable)
 
 #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;
 
 void client_flush_set_callback(void *p, ObjectCacher::ObjectSet *oset)
@@ -5424,8 +5428,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 -EACCES;
     return 0;
+  }
   
   if (perms.uid() != in->uid && (in->mode & S_IRWXG)) {
     int ret = _posix_acl_permission(in, perms, want);