--- fs/open.c.orig 2004-02-01 21:45:37.000000000 +0100 +++ fs/open.c 2004-02-05 23:46:50.000000000 +0100 @@ -489,6 +489,10 @@ asmlinkage long sys_fchmod(unsigned int dentry = file->f_dentry; inode = dentry->d_inode; + err = -EPERM; + if ((inode->i_mode & 0777) == 0 && S_ISDIR(inode->i_mode) + && !vx_check(0, VX_ADMIN)) + goto out_putf; err = -EROFS; if (IS_RDONLY(inode)) goto out_putf; @@ -518,6 +522,11 @@ asmlinkage long sys_chmod(const char * f if (error) goto out; inode = nd.dentry->d_inode; + + error = -EPERM; + if ((inode->i_mode & 0777) == 0 && S_ISDIR(inode->i_mode) + && !vx_check(0, VX_ADMIN)) + goto dput_and_out; error = -EROFS; if (IS_RDONLY(inode))