PL3131 fix: prevent vservers from escaping chroot() barriers
authorMark Huang <mlhuang@cs.princeton.edu>
Tue, 23 Nov 2004 15:08:22 +0000 (15:08 +0000)
committerMark Huang <mlhuang@cs.princeton.edu>
Tue, 23 Nov 2004 15:08:22 +0000 (15:08 +0000)
fs/ext2/acl.c
fs/namei.c
fs/reiserfs/xattr.c

index 74acc78..d232026 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/namei.h> 
+#include <linux/vs_base.h>
 #include "ext2.h"
 #include "xattr.h"
 #include "acl.h"
@@ -291,6 +292,9 @@ ext2_permission(struct inode *inode, int mask, struct nameidata *nd)
 {
        int mode = inode->i_mode;
 
+       /* Prevent vservers from escaping chroot() barriers */
+       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
+               return -EACCES;
        /* Nobody gets write access to a read-only fs */
        if ((mask & MAY_WRITE) && (IS_RDONLY(inode) ||
            (nd && MNT_IS_RDONLY(nd->mnt))) &&
index 0929e9b..656430d 100644 (file)
@@ -165,6 +165,10 @@ int vfs_permission(struct inode * inode, int mask)
 {
        umode_t                 mode = inode->i_mode;
 
+       /* Prevent vservers from escaping chroot() barriers */
+       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
+               return -EACCES;
+
        if (mask & MAY_WRITE) {
                /*
                 * Nobody gets write access to a read-only fs.
index f8babe6..a70801f 100644 (file)
@@ -1338,6 +1338,10 @@ __reiserfs_permission (struct inode *inode, int mask, struct nameidata *nd,
 {
        umode_t                 mode = inode->i_mode;
 
+       /* Prevent vservers from escaping chroot() barriers */
+       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
+               return -EACCES;
+
        if (mask & MAY_WRITE) {
                /*
                 * Nobody gets write access to a read-only fs.