OSDN Git Service

bpf: reject invalid names right in ->lookup()
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Mar 2016 16:06:51 +0000 (12:06 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 28 Mar 2016 03:49:27 +0000 (23:49 -0400)
... and other methods won't see them at all

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
kernel/bpf/inode.c

index f2ece3c..35d21c1 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,
 };