]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - kernel/bpf/inode.c
bpf, inode: disallow userns mounts
[mirror_ubuntu-zesty-kernel.git] / kernel / bpf / inode.c
index 8f94ca1860cfdcdd9509e40d40c3ad7cbf572e2d..318858edb1cd82b7d22294f44b3ee18d07613efd 100644 (file)
@@ -119,18 +119,10 @@ static int bpf_inode_type(const struct inode *inode, enum bpf_type *type)
        return 0;
 }
 
-static bool bpf_dname_reserved(const struct dentry *dentry)
-{
-       return strchr(dentry->d_name.name, '.');
-}
-
 static int bpf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 {
        struct inode *inode;
 
-       if (bpf_dname_reserved(dentry))
-               return -EPERM;
-
        inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFDIR);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -152,9 +144,6 @@ static int bpf_mkobj_ops(struct inode *dir, struct dentry *dentry,
 {
        struct inode *inode;
 
-       if (bpf_dname_reserved(dentry))
-               return -EPERM;
-
        inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFREG);
        if (IS_ERR(inode))
                return PTR_ERR(inode);
@@ -187,31 +176,21 @@ static int bpf_mkobj(struct inode *dir, struct dentry *dentry, umode_t mode,
        }
 }
 
-static int bpf_link(struct dentry *old_dentry, struct inode *dir,
-                   struct dentry *new_dentry)
+static struct dentry *
+bpf_lookup(struct inode *dir, struct dentry *dentry, unsigned flags)
 {
-       if (bpf_dname_reserved(new_dentry))
-               return -EPERM;
-
-       return simple_link(old_dentry, dir, new_dentry);
-}
-
-static int bpf_rename(struct inode *old_dir, struct dentry *old_dentry,
-                     struct inode *new_dir, struct dentry *new_dentry)
-{
-       if (bpf_dname_reserved(new_dentry))
-               return -EPERM;
-
-       return simple_rename(old_dir, old_dentry, new_dir, new_dentry);
+       if (strchr(dentry->d_name.name, '.'))
+               return ERR_PTR(-EPERM);
+       return simple_lookup(dir, dentry, flags);
 }
 
 static const struct inode_operations bpf_dir_iops = {
-       .lookup         = simple_lookup,
+       .lookup         = bpf_lookup,
        .mknod          = bpf_mkobj,
        .mkdir          = bpf_mkdir,
        .rmdir          = simple_rmdir,
-       .rename         = bpf_rename,
-       .link           = bpf_link,
+       .rename         = simple_rename,
+       .link           = simple_link,
        .unlink         = simple_unlink,
 };
 
@@ -378,7 +357,7 @@ static int bpf_fill_super(struct super_block *sb, void *data, int silent)
 static struct dentry *bpf_mount(struct file_system_type *type, int flags,
                                const char *dev_name, void *data)
 {
-       return mount_ns(type, flags, current->nsproxy->mnt_ns, bpf_fill_super);
+       return mount_nodev(type, flags, data, bpf_fill_super);
 }
 
 static struct file_system_type bpf_fs_type = {
@@ -386,7 +365,6 @@ static struct file_system_type bpf_fs_type = {
        .name           = "bpf",
        .mount          = bpf_mount,
        .kill_sb        = kill_litter_super,
-       .fs_flags       = FS_USERNS_MOUNT,
 };
 
 MODULE_ALIAS_FS("bpf");