lkml.org 
[lkml]   [2019]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.0 107/238] ext4: fix check of inode in swap_inode_boot_loader
    Date
    5.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: yangerkun <yangerkun@huawei.com>

    commit 67a11611e1a5211f6569044fbf8150875764d1d0 upstream.

    Before really do swap between inode and boot inode, something need to
    check to avoid invalid or not permitted operation, like does this inode
    has inline data. But the condition check should be protected by inode
    lock to avoid change while swapping. Also some other condition will not
    change between swapping, but there has no problem to do this under inode
    lock.

    Signed-off-by: yangerkun <yangerkun@huawei.com>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Cc: stable@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/ext4/ioctl.c | 22 +++++++++++++---------
    1 file changed, 13 insertions(+), 9 deletions(-)

    --- a/fs/ext4/ioctl.c
    +++ b/fs/ext4/ioctl.c
    @@ -116,15 +116,6 @@ static long swap_inode_boot_loader(struc
    struct inode *inode_bl;
    struct ext4_inode_info *ei_bl;

    - if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode) ||
    - IS_SWAPFILE(inode) || IS_ENCRYPTED(inode) ||
    - ext4_has_inline_data(inode))
    - return -EINVAL;
    -
    - if (IS_RDONLY(inode) || IS_APPEND(inode) || IS_IMMUTABLE(inode) ||
    - !inode_owner_or_capable(inode) || !capable(CAP_SYS_ADMIN))
    - return -EPERM;
    -
    inode_bl = ext4_iget(sb, EXT4_BOOT_LOADER_INO, EXT4_IGET_SPECIAL);
    if (IS_ERR(inode_bl))
    return PTR_ERR(inode_bl);
    @@ -137,6 +128,19 @@ static long swap_inode_boot_loader(struc
    * that only 1 swap_inode_boot_loader is running. */
    lock_two_nondirectories(inode, inode_bl);

    + if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode) ||
    + IS_SWAPFILE(inode) || IS_ENCRYPTED(inode) ||
    + ext4_has_inline_data(inode)) {
    + err = -EINVAL;
    + goto journal_err_out;
    + }
    +
    + if (IS_RDONLY(inode) || IS_APPEND(inode) || IS_IMMUTABLE(inode) ||
    + !inode_owner_or_capable(inode) || !capable(CAP_SYS_ADMIN)) {
    + err = -EPERM;
    + goto journal_err_out;
    + }
    +
    /* Wait for all existing dio workers */
    inode_dio_wait(inode);
    inode_dio_wait(inode_bl);

    \
     
     \ /
      Last update: 2019-03-22 13:32    [W:4.599 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site