Whamcloud - gitweb
Branch HEAD
authoryangsheng <yangsheng>
Wed, 3 Sep 2008 07:00:06 +0000 (07:00 +0000)
committeryangsheng <yangsheng>
Wed, 3 Sep 2008 07:00:06 +0000 (07:00 +0000)
b=15593
i=nikita, yury

Restore the ATTR_KILL_SUID and bypass permission check in the case.

lustre/llite/llite_lib.c
lustre/mdd/mdd_object.c
lustre/mdt/mdt_lib.c

index dbf95a8..85b8d06 100644 (file)
@@ -1638,6 +1638,16 @@ int ll_setattr(struct dentry *de, struct iattr *attr)
             (ATTR_CTIME|ATTR_SIZE|ATTR_MODE))
                 attr->ia_valid |= MDS_OPEN_OWNEROVERRIDE;
 
+        if ((de->d_inode->i_mode & S_ISUID) &&
+            !(attr->ia_mode & S_ISUID) &&
+            !(attr->ia_valid & ATTR_KILL_SUID))
+                attr->ia_valid |= ATTR_KILL_SUID;
+
+        if (((de->d_inode->i_mode & (S_ISGID|S_IXGRP)) == (S_ISGID|S_IXGRP)) &&
+            !(attr->ia_mode & S_ISGID) &&
+            !(attr->ia_valid & ATTR_KILL_SGID))
+                attr->ia_valid |= ATTR_KILL_SGID;
+
         return ll_setattr_raw(de->d_inode, attr);
 }
 
index 74b628b..39d3814 100644 (file)
@@ -735,6 +735,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj,
                 /* Bypass la_vaild == LA_MODE,
                  * this is for changing file with SUID or SGID. */
                 if ((la->la_valid & ~LA_MODE) &&
+                    !(ma->ma_attr_flags & MDS_PERM_BYPASS) &&
                     (uc->mu_fsuid != tmp_la->la_uid) &&
                     !mdd_capable(uc, CAP_FOWNER))
                         RETURN(-EPERM);
index ec1463d..5fffcf2 100644 (file)
@@ -683,6 +683,9 @@ static __u64 mdt_attr_valid_xlate(__u64 in, struct mdt_reint_record *rr,
         if (in & MDS_OPEN_OWNEROVERRIDE)
                 ma->ma_attr_flags |= MDS_OPEN_OWNEROVERRIDE;
 
+        if (in & (ATTR_KILL_SUID|ATTR_KILL_SGID))
+                ma->ma_attr_flags |= MDS_PERM_BYPASS;
+
         /*XXX need ATTR_RAW?*/
         in &= ~(ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_SIZE|ATTR_BLOCKS|
                 ATTR_ATIME|ATTR_MTIME|ATTR_CTIME|ATTR_FROM_OPEN|