VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / fs / attr.c
index 34dcb1a..89e03f7 100644 (file)
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -14,6 +14,9 @@
 #include <linux/fcntl.h>
 #include <linux/quotaops.h>
 #include <linux/security.h>
+#include <linux/vs_base.h>
+#include <linux/proc_fs.h>
+#include <linux/devpts_fs.h>
 
 /* Taken over from the old code... */
 
@@ -35,7 +38,8 @@ int inode_change_ok(struct inode *inode, struct iattr *attr)
 
        /* Make sure caller can chgrp. */
        if ((ia_valid & ATTR_GID) &&
-           (!in_group_p(attr->ia_gid) && attr->ia_gid != inode->i_gid) &&
+           (current->fsuid != inode->i_uid ||
+           (!in_group_p(attr->ia_gid) && attr->ia_gid != inode->i_gid)) &&
            !capable(CAP_CHOWN))
                goto error;
 
@@ -54,6 +58,31 @@ int inode_change_ok(struct inode *inode, struct iattr *attr)
                if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER))
                        goto error;
        }
+
+       /* Check for evil vserver activity */
+       if (vx_check(0, VX_ADMIN))
+               goto fine;
+
+       if (IS_BARRIER(inode)) {
+               printk(KERN_WARNING
+                       "VSW: xid=%d messing with the barrier.\n",
+                       vx_current_xid());
+               goto error;
+       }
+       switch (inode->i_sb->s_magic) {
+               case PROC_SUPER_MAGIC:
+                       printk(KERN_WARNING
+                               "VSW: xid=%d messing with the procfs.\n",
+                               vx_current_xid());
+                       goto error;
+               case DEVPTS_SUPER_MAGIC:
+                       if (vx_check(inode->i_xid, VX_IDENT))
+                               goto fine;
+                       printk(KERN_WARNING
+                               "VSW: xid=%d messing with the devpts.\n",
+                               vx_current_xid());
+                       goto error;     
+       }
 fine:
        retval = 0;
 error: