diff -NurpP --minimal linux-2.6.3-vs0.09.z/fs/proc/generic.c linux-2.6.3-vs0.09.z3/fs/proc/generic.c --- linux-2.6.3-vs0.09.z/fs/proc/generic.c 2004-02-19 02:46:23.000000000 +0100 +++ linux-2.6.3-vs0.09.z3/fs/proc/generic.c 2004-02-23 04:49:55.000000000 +0100 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -350,7 +351,7 @@ struct dentry *proc_lookup(struct inode for (de = de->subdir; de ; de = de->next) { if (de->namelen != dentry->d_name.len) continue; - if (!vx_weak_check(0, de->vx_flags)) + if (!vx_hide_check(0, de->vx_flags)) continue; if (!memcmp(dentry->d_name.name, de->name, de->namelen)) { int ino = de->low_ino; @@ -427,7 +428,7 @@ int proc_readdir(struct file * filp, } do { - if (!vx_weak_check(0, de->vx_flags)) + if (!vx_hide_check(0, de->vx_flags)) goto skip; if (filldir(dirent, de->name, de->namelen, filp->f_pos, de->low_ino, de->mode >> 12) < 0) @@ -544,7 +545,7 @@ static struct proc_dir_entry *proc_creat ent->namelen = len; ent->mode = mode; ent->nlink = nlink; - ent->vx_flags = VX_ADMIN; + ent->vx_flags = IATTR_ADMIN | IATTR_HIDE; out: return ent; } @@ -566,7 +567,7 @@ struct proc_dir_entry *proc_symlink(cons kfree(ent); ent = NULL; } else - ent->vx_flags = 0; + ent->vx_flags = IATTR_ADMIN; } else { kfree(ent); ent = NULL; diff -NurpP --minimal linux-2.6.3-vs0.09.z/include/linux/vserver/inode.h linux-2.6.3-vs0.09.z3/include/linux/vserver/inode.h --- linux-2.6.3-vs0.09.z/include/linux/vserver/inode.h 2004-02-21 23:49:05.000000000 +0100 +++ linux-2.6.3-vs0.09.z3/include/linux/vserver/inode.h 2004-02-23 04:34:13.000000000 +0100 @@ -38,6 +38,8 @@ struct vcmd_ctx_iattr_v1 { #define IATTR_BARRIER 0x00010000 #define IATTR_IUNLINK 0x00020000 +#define vx_hide_check(c,m) (((m) & IATTR_HIDE) ? vx_check(c,m) : 1) + extern int vc_get_iattr_v0(uint32_t, void *); extern int vc_set_iattr_v0(uint32_t, void *); diff -NurpP --minimal linux-2.6.3-vs0.09.z/kernel/vserver/inode.c linux-2.6.3-vs0.09.z3/kernel/vserver/inode.c --- linux-2.6.3-vs0.09.z/kernel/vserver/inode.c 2004-02-22 00:09:42.000000000 +0100 +++ linux-2.6.3-vs0.09.z3/kernel/vserver/inode.c 2004-02-23 04:04:19.000000000 +0100 @@ -41,10 +41,13 @@ static int __vc_get_iattr(struct inode * if (in->i_sb->s_magic == PROC_SUPER_MAGIC) { struct proc_dir_entry *entry = PROC_I(in)->pde; - - // check for specific inodes - *flags |= (entry->vx_flags & IATTR_FLAGS); + *mask |= IATTR_FLAGS; + // check for specific inodes ? + if (entry) + *flags |= (entry->vx_flags & IATTR_FLAGS); + else + *flags |= (PROC_I(in)->vx_flags & IATTR_FLAGS); } return 0; } @@ -119,10 +122,13 @@ static int __vc_set_iattr(struct inode * if (*mask & IATTR_FLAGS) { struct proc_dir_entry *entry = PROC_I(in)->pde; - unsigned int iflags = entry->vx_flags; + unsigned int iflags = PROC_I(in)->vx_flags; - entry->vx_flags = (iflags & ~(*mask & IATTR_FLAGS)) + iflags = (iflags & ~(*mask & IATTR_FLAGS)) | (*flags & IATTR_FLAGS); + PROC_I(in)->vx_flags = iflags; + if (entry) + entry->vx_flags = iflags; } if (*mask & IATTR_BARRIER) @@ -143,8 +149,6 @@ int vc_set_iattr_v0(uint32_t dev, void * struct vcmd_ctx_iattr_v0 vc_data; int ret; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) @@ -173,8 +177,8 @@ int vc_set_iattr(uint32_t id, void *data struct vcmd_ctx_iattr_v1 vc_data; int ret; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; + if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) + return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT;