lkml.org 
[lkml]   [2020]   [Nov]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH v2 02/24] exec: Simplify unshare_files
    Now that exec no longer needs to return the unshared files to their
    previous value there is no reason to return displaced.

    Instead when unshare_fd creates a copy of the file table, call
    put_files_struct before returning from unshare_files.

    Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
    v1: https://lkml.kernel.org/r/20200817220425.9389-2-ebiederm@xmission.com
    Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
    ---
    fs/coredump.c | 5 +----
    fs/exec.c | 5 +----
    include/linux/fdtable.h | 2 +-
    kernel/fork.c | 12 ++++++------
    4 files changed, 9 insertions(+), 15 deletions(-)

    diff --git a/fs/coredump.c b/fs/coredump.c
    index 0cd9056d79cc..abf807235262 100644
    --- a/fs/coredump.c
    +++ b/fs/coredump.c
    @@ -585,7 +585,6 @@ void do_coredump(const kernel_siginfo_t *siginfo)
    int ispipe;
    size_t *argv = NULL;
    int argc = 0;
    - struct files_struct *displaced;
    /* require nonrelative corefile path and be extra careful */
    bool need_suid_safe = false;
    bool core_dumped = false;
    @@ -791,11 +790,9 @@ void do_coredump(const kernel_siginfo_t *siginfo)
    }

    /* get us an unshared descriptor table; almost always a no-op */
    - retval = unshare_files(&displaced);
    + retval = unshare_files();
    if (retval)
    goto close_fail;
    - if (displaced)
    - put_files_struct(displaced);
    if (!dump_interrupted()) {
    /*
    * umh disabled with CONFIG_STATIC_USERMODEHELPER_PATH="" would
    diff --git a/fs/exec.c b/fs/exec.c
    index fa788988efe9..14fae2ec1c9d 100644
    --- a/fs/exec.c
    +++ b/fs/exec.c
    @@ -1238,7 +1238,6 @@ void __set_task_comm(struct task_struct *tsk, const char *buf, bool exec)
    int begin_new_exec(struct linux_binprm * bprm)
    {
    struct task_struct *me = current;
    - struct files_struct *displaced;
    int retval;

    /* Once we are committed compute the creds */
    @@ -1259,11 +1258,9 @@ int begin_new_exec(struct linux_binprm * bprm)
    goto out;

    /* Ensure the files table is not shared. */
    - retval = unshare_files(&displaced);
    + retval = unshare_files();
    if (retval)
    goto out;
    - if (displaced)
    - put_files_struct(displaced);

    /*
    * Must be called _before_ exec_mmap() as bprm->mm is
    diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h
    index a32bf47c593e..f46a084b60b2 100644
    --- a/include/linux/fdtable.h
    +++ b/include/linux/fdtable.h
    @@ -109,7 +109,7 @@ struct task_struct;
    struct files_struct *get_files_struct(struct task_struct *);
    void put_files_struct(struct files_struct *fs);
    void reset_files_struct(struct files_struct *);
    -int unshare_files(struct files_struct **);
    +int unshare_files(void);
    struct files_struct *dup_fd(struct files_struct *, unsigned, int *) __latent_entropy;
    void do_close_on_exec(struct files_struct *);
    int iterate_fd(struct files_struct *, unsigned,
    diff --git a/kernel/fork.c b/kernel/fork.c
    index 32083db7a2a2..837b546528c8 100644
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -3023,21 +3023,21 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
    * the exec layer of the kernel.
    */

    -int unshare_files(struct files_struct **displaced)
    +int unshare_files(void)
    {
    struct task_struct *task = current;
    - struct files_struct *copy = NULL;
    + struct files_struct *old, *copy = NULL;
    int error;

    error = unshare_fd(CLONE_FILES, NR_OPEN_MAX, &copy);
    - if (error || !copy) {
    - *displaced = NULL;
    + if (error || !copy)
    return error;
    - }
    - *displaced = task->files;
    +
    + old = task->files;
    task_lock(task);
    task->files = copy;
    task_unlock(task);
    + put_files_struct(old);
    return 0;
    }

    --
    2.25.0
    \
     
     \ /
      Last update: 2020-11-21 00:18    [W:3.953 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site