lkml.org 
[lkml]   [2020]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4/6] switch readdir(2) to unsafe_copy_dirent_name()
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    ... and the same for its compat counterpart

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    ---
    fs/readdir.c | 30 ++++++++++++++++--------------
    1 file changed, 16 insertions(+), 14 deletions(-)

    diff --git a/fs/readdir.c b/fs/readdir.c
    index ed6aaad451aa..a9085016a619 100644
    --- a/fs/readdir.c
    +++ b/fs/readdir.c
    @@ -157,17 +157,18 @@ static int fillonedir(struct dir_context *ctx, const char *name, int namlen,
    }
    buf->result++;
    dirent = buf->dirent;
    - if (!access_ok(dirent,
    + if (!user_write_access_begin(dirent,
    (unsigned long)(dirent->d_name + namlen + 1) -
    (unsigned long)dirent))
    goto efault;
    - if ( __put_user(d_ino, &dirent->d_ino) ||
    - __put_user(offset, &dirent->d_offset) ||
    - __put_user(namlen, &dirent->d_namlen) ||
    - __copy_to_user(dirent->d_name, name, namlen) ||
    - __put_user(0, dirent->d_name + namlen))
    - goto efault;
    + unsafe_put_user(d_ino, &dirent->d_ino, efault_end);
    + unsafe_put_user(offset, &dirent->d_offset, efault_end);
    + unsafe_put_user(namlen, &dirent->d_namlen, efault_end);
    + unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end);
    + user_write_access_end();
    return 0;
    +efault_end:
    + user_write_access_end();
    efault:
    buf->result = -EFAULT;
    return -EFAULT;
    @@ -424,17 +425,18 @@ static int compat_fillonedir(struct dir_context *ctx, const char *name,
    }
    buf->result++;
    dirent = buf->dirent;
    - if (!access_ok(dirent,
    + if (!user_write_access_begin(dirent,
    (unsigned long)(dirent->d_name + namlen + 1) -
    (unsigned long)dirent))
    goto efault;
    - if ( __put_user(d_ino, &dirent->d_ino) ||
    - __put_user(offset, &dirent->d_offset) ||
    - __put_user(namlen, &dirent->d_namlen) ||
    - __copy_to_user(dirent->d_name, name, namlen) ||
    - __put_user(0, dirent->d_name + namlen))
    - goto efault;
    + unsafe_put_user(d_ino, &dirent->d_ino, efault_end);
    + unsafe_put_user(offset, &dirent->d_offset, efault_end);
    + unsafe_put_user(namlen, &dirent->d_namlen, efault_end);
    + unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end);
    + user_write_access_end();
    return 0;
    +efault_end:
    + user_write_access_end();
    efault:
    buf->result = -EFAULT;
    return -EFAULT;
    --
    2.11.0
    \
     
     \ /
      Last update: 2020-05-29 01:50    [W:2.226 / U:0.308 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site