lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 279/287] f2fs: fix to avoid use f2fs_bug_on() in f2fs_new_node_page()
    Date
    From: Chao Yu <chao.yu@oppo.com>

    [ Upstream commit 141170b759e03958f296033bb7001be62d1d363b ]

    As Dipanjan Das <mail.dipanjan.das@gmail.com> reported, syzkaller
    found a f2fs bug as below:

    RIP: 0010:f2fs_new_node_page+0x19ac/0x1fc0 fs/f2fs/node.c:1295
    Call Trace:
    write_all_xattrs fs/f2fs/xattr.c:487 [inline]
    __f2fs_setxattr+0xe76/0x2e10 fs/f2fs/xattr.c:743
    f2fs_setxattr+0x233/0xab0 fs/f2fs/xattr.c:790
    f2fs_xattr_generic_set+0x133/0x170 fs/f2fs/xattr.c:86
    __vfs_setxattr+0x115/0x180 fs/xattr.c:182
    __vfs_setxattr_noperm+0x125/0x5f0 fs/xattr.c:216
    __vfs_setxattr_locked+0x1cf/0x260 fs/xattr.c:277
    vfs_setxattr+0x13f/0x330 fs/xattr.c:303
    setxattr+0x146/0x160 fs/xattr.c:611
    path_setxattr+0x1a7/0x1d0 fs/xattr.c:630
    __do_sys_lsetxattr fs/xattr.c:653 [inline]
    __se_sys_lsetxattr fs/xattr.c:649 [inline]
    __x64_sys_lsetxattr+0xbd/0x150 fs/xattr.c:649
    do_syscall_x64 arch/x86/entry/common.c:50 [inline]
    do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    NAT entry and nat bitmap can be inconsistent, e.g. one nid is free
    in nat bitmap, and blkaddr in its NAT entry is not NULL_ADDR, it
    may trigger BUG_ON() in f2fs_new_node_page(), fix it.

    Reported-by: Dipanjan Das <mail.dipanjan.das@gmail.com>
    Signed-off-by: Chao Yu <chao.yu@oppo.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/f2fs/node.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
    index ff3f97ba1a55..2c28f488ac2f 100644
    --- a/fs/f2fs/node.c
    +++ b/fs/f2fs/node.c
    @@ -1232,7 +1232,11 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs)
    dec_valid_node_count(sbi, dn->inode, !ofs);
    goto fail;
    }
    - f2fs_bug_on(sbi, new_ni.blk_addr != NULL_ADDR);
    + if (unlikely(new_ni.blk_addr != NULL_ADDR)) {
    + err = -EFSCORRUPTED;
    + set_sbi_flag(sbi, SBI_NEED_FSCK);
    + goto fail;
    + }
    #endif
    new_ni.nid = dn->nid;
    new_ni.ino = dn->inode->i_ino;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-23 13:07    [W:3.551 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site