lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 688/757] udf: Avoid accessing uninitialized data on failed inode read
    Date
    From: Jan Kara <jack@suse.cz>

    [ Upstream commit 044e2e26f214e5ab26af85faffd8d1e4ec066931 ]

    When we fail to read inode, some data accessed in udf_evict_inode() may
    be uninitialized. Move the accesses to !is_bad_inode() branch.

    Reported-by: syzbot+91f02b28f9bb5f5f1341@syzkaller.appspotmail.com
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/udf/inode.c | 25 ++++++++++++++-----------
    1 file changed, 14 insertions(+), 11 deletions(-)

    diff --git a/fs/udf/inode.c b/fs/udf/inode.c
    index adaba8e8b326e..566118417e562 100644
    --- a/fs/udf/inode.c
    +++ b/fs/udf/inode.c
    @@ -139,21 +139,24 @@ void udf_evict_inode(struct inode *inode)
    struct udf_inode_info *iinfo = UDF_I(inode);
    int want_delete = 0;

    - if (!inode->i_nlink && !is_bad_inode(inode)) {
    - want_delete = 1;
    - udf_setsize(inode, 0);
    - udf_update_inode(inode, IS_SYNC(inode));
    + if (!is_bad_inode(inode)) {
    + if (!inode->i_nlink) {
    + want_delete = 1;
    + udf_setsize(inode, 0);
    + udf_update_inode(inode, IS_SYNC(inode));
    + }
    + if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB &&
    + inode->i_size != iinfo->i_lenExtents) {
    + udf_warn(inode->i_sb,
    + "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n",
    + inode->i_ino, inode->i_mode,
    + (unsigned long long)inode->i_size,
    + (unsigned long long)iinfo->i_lenExtents);
    + }
    }
    truncate_inode_pages_final(&inode->i_data);
    invalidate_inode_buffers(inode);
    clear_inode(inode);
    - if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB &&
    - inode->i_size != iinfo->i_lenExtents) {
    - udf_warn(inode->i_sb, "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n",
    - inode->i_ino, inode->i_mode,
    - (unsigned long long)inode->i_size,
    - (unsigned long long)iinfo->i_lenExtents);
    - }
    kfree(iinfo->i_ext.i_data);
    iinfo->i_ext.i_data = NULL;
    udf_clear_extent_cache(inode);
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:14    [W:4.020 / U:0.668 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site