lkml.org 
[lkml]   [2018]   [Mar]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 28/35] syscalls: do not call sys_symlink{,at}() within the kernel
    Date
    CC: Al Viro <viro@zeniv.linux.org.uk>
    CC: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
    ---
    fs/internal.h | 2 ++
    fs/namei.c | 12 +++++++++---
    include/linux/syscalls.h | 8 ++++++++
    init/initramfs.c | 2 +-
    4 files changed, 20 insertions(+), 4 deletions(-)

    diff --git a/fs/internal.h b/fs/internal.h
    index 53846bd4d9d7..a3f04ca2a08b 100644
    --- a/fs/internal.h
    +++ b/fs/internal.h
    @@ -58,6 +58,8 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
    long do_mkdirat(int dfd, const char __user *pathname, umode_t mode);
    long do_rmdir(int dfd, const char __user *pathname);
    long do_unlinkat(int dfd, struct filename *name);
    +long do_symlinkat(const char __user *oldname, int newdfd,
    + const char __user *newname);

    /*
    * namespace.c
    diff --git a/fs/namei.c b/fs/namei.c
    index dcf506227509..e15da92209d5 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -4113,8 +4113,8 @@ int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
    }
    EXPORT_SYMBOL(vfs_symlink);

    -SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
    - int, newdfd, const char __user *, newname)
    +long do_symlinkat(const char __user *oldname, int newdfd,
    + const char __user *newname)
    {
    int error;
    struct filename *from;
    @@ -4144,9 +4144,15 @@ SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
    return error;
    }

    +SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
    + int, newdfd, const char __user *, newname)
    +{
    + return do_symlinkat(oldname, newdfd, newname);
    +}
    +
    SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
    {
    - return sys_symlinkat(oldname, AT_FDCWD, newname);
    + return do_symlinkat(oldname, AT_FDCWD, newname);
    }

    /**
    diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
    index e7fb0295dbfc..178d1321a037 100644
    --- a/include/linux/syscalls.h
    +++ b/include/linux/syscalls.h
    @@ -985,4 +985,12 @@ static inline long ksys_mkdir(const char __user *pathname, umode_t mode)
    return do_mkdirat(AT_FDCWD, pathname, mode);
    }

    +extern long do_symlinkat(const char __user *oldname, int newdfd,
    + const char __user *newname);
    +static inline long ksys_symlink(const char __user *oldname,
    + const char __user *newname)
    +{
    + return do_symlinkat(oldname, AT_FDCWD, newname);
    +}
    +
    #endif
    diff --git a/init/initramfs.c b/init/initramfs.c
    index ca538a5f9fa9..cd9571a113b6 100644
    --- a/init/initramfs.c
    +++ b/init/initramfs.c
    @@ -392,7 +392,7 @@ static int __init do_symlink(void)
    {
    collected[N_ALIGN(name_len) + body_len] = '\0';
    clean_path(collected, 0);
    - sys_symlink(collected + N_ALIGN(name_len), collected);
    + ksys_symlink(collected + N_ALIGN(name_len), collected);
    sys_lchown(collected, uid, gid);
    do_utime(collected, mtime);
    state = SkipIt;
    --
    2.16.2
    \
     
     \ /
      Last update: 2018-03-11 12:01    [W:2.792 / U:0.580 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site