lkml.org 
[lkml]   [2022]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.10 15/19] f2fs: fix to do sanity check on segment type in build_sit_entries()
    Date
    From: Chao Yu <chao.yu@oppo.com>

    [ Upstream commit 09beadf289d6e300553e60d6e76f13c0427ecab3 ]

    As Wenqing Liu <wenqingliu0120@gmail.com> reported in bugzilla:

    https://bugzilla.kernel.org/show_bug.cgi?id=216285

    RIP: 0010:memcpy_erms+0x6/0x10
    f2fs_update_meta_page+0x84/0x570 [f2fs]
    change_curseg.constprop.0+0x159/0xbd0 [f2fs]
    f2fs_do_replace_block+0x5c7/0x18a0 [f2fs]
    f2fs_replace_block+0xeb/0x180 [f2fs]
    recover_data+0x1abd/0x6f50 [f2fs]
    f2fs_recover_fsync_data+0x12ce/0x3250 [f2fs]
    f2fs_fill_super+0x4459/0x6190 [f2fs]
    mount_bdev+0x2cf/0x3b0
    legacy_get_tree+0xed/0x1d0
    vfs_get_tree+0x81/0x2b0
    path_mount+0x47e/0x19d0
    do_mount+0xce/0xf0
    __x64_sys_mount+0x12c/0x1a0
    do_syscall_64+0x38/0x90
    entry_SYSCALL_64_after_hwframe+0x63/0xcd

    The root cause is segment type is invalid, so in f2fs_do_replace_block(),
    f2fs accesses f2fs_sm_info::curseg_array with out-of-range segment type,
    result in accessing invalid curseg->sum_blk during memcpy in
    f2fs_update_meta_page(). Fix this by adding sanity check on segment type
    in build_sit_entries().

    Reported-by: Wenqing Liu <wenqingliu0120@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/segment.c | 13 +++++++++++++
    1 file changed, 13 insertions(+)

    diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
    index 20091f4cf84d..19224e7d2ad0 100644
    --- a/fs/f2fs/segment.c
    +++ b/fs/f2fs/segment.c
    @@ -4449,6 +4449,12 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
    return err;
    seg_info_from_raw_sit(se, &sit);

    + if (se->type >= NR_PERSISTENT_LOG) {
    + f2fs_err(sbi, "Invalid segment type: %u, segno: %u",
    + se->type, start);
    + return -EFSCORRUPTED;
    + }
    +
    sit_valid_blocks[SE_PAGETYPE(se)] += se->valid_blocks;

    /* build discard map only one time */
    @@ -4495,6 +4501,13 @@ static int build_sit_entries(struct f2fs_sb_info *sbi)
    break;
    seg_info_from_raw_sit(se, &sit);

    + if (se->type >= NR_PERSISTENT_LOG) {
    + f2fs_err(sbi, "Invalid segment type: %u, segno: %u",
    + se->type, start);
    + err = -EFSCORRUPTED;
    + break;
    + }
    +
    sit_valid_blocks[SE_PAGETYPE(se)] += se->valid_blocks;

    if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) {
    --
    2.35.1
    \
     
     \ /
      Last update: 2022-08-14 18:38    [W:7.101 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site