lkml.org 
[lkml]   [2010]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 25/35] VFS: Create user_path_nd() to lookup both parent and target
    Date
    Proof-of-concept implementation of user_path_nd().  Lookup both the
    parent and the target of a user-supplied filename, to supply later to
    union copyup routines.
    ---
    fs/namei.c | 31 +++++++++++++++++++++++++++++++
    include/linux/namei.h | 2 ++
    2 files changed, 33 insertions(+), 0 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index 24e0cb2..68aa8ab 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -1563,6 +1563,37 @@ static int user_path_parent(int dfd, const char __user *path,
    return error;
    }

    +int user_path_nd(int dfd, const char __user *filename,
    + unsigned flags, struct nameidata *parent_nd,
    + struct path *child, char **tmp)
    +{
    + struct nameidata child_nd;
    + char *s = getname(filename);
    + int error;
    +
    + if (IS_ERR(s))
    + return PTR_ERR(s);
    +
    + /* Lookup parent */
    + error = do_path_lookup(dfd, s, LOOKUP_PARENT, parent_nd);
    + if (error)
    + goto out_putname;
    +
    + /* Lookup child - XXX optimize, racy */
    + error = do_path_lookup(dfd, s, flags, &child_nd);
    + if (error)
    + goto out_path_put;
    + *child = child_nd.path;
    + *tmp = s;
    + return 0;
    +
    +out_path_put:
    + path_put(&parent_nd->path);
    +out_putname:
    + putname(s);
    + return error;
    +}
    +
    /*
    * It's inline, so penalty for filesystems that don't use sticky bit is
    * minimal.
    diff --git a/include/linux/namei.h b/include/linux/namei.h
    index 05b441d..83dc8b5 100644
    --- a/include/linux/namei.h
    +++ b/include/linux/namei.h
    @@ -58,6 +58,8 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND};
    #define LOOKUP_RENAME_TARGET 0x0800

    extern int user_path_at(int, const char __user *, unsigned, struct path *);
    +extern int user_path_nd(int, const char __user *, unsigned,
    + struct nameidata *, struct path *, char **);

    #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path)
    #define user_lpath(name, path) user_path_at(AT_FDCWD, name, 0, path)
    --
    1.6.3.3


    \
     
     \ /
      Last update: 2010-04-16 01:13    [W:0.024 / U:0.904 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site