• Chao Yu's avatar
    f2fs: fix to do sanity check on summary info · c6ad7fd1
    Chao Yu authored
    As Wenqing Liu reported in bugzilla:
    
    https://bugzilla.kernel.org/show_bug.cgi?id=216456
    
    BUG: KASAN: use-after-free in recover_data+0x63ae/0x6ae0 [f2fs]
    Read of size 4 at addr ffff8881464dcd80 by task mount/1013
    
    CPU: 3 PID: 1013 Comm: mount Tainted: G        W          6.0.0-rc4 #1
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.15.0-1 04/01/2014
    Call Trace:
     dump_stack_lvl+0x45/0x5e
     print_report.cold+0xf3/0x68d
     kasan_report+0xa8/0x130
     recover_data+0x63ae/0x6ae0 [f2fs]
     f2fs_recover_fsync_data+0x120d/0x1fc0 [f2fs]
     f2fs_fill_super+0x4665/0x61e0 [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: in fuzzed image, SSA table is corrupted: ofs_in_node
    is larger than ADDRS_PER_PAGE(), result in out-of-range access on 4k-size
    page.
    
    - recover_data
     - do_recover_data
      - check_index_in_prev_nodes
       - f2fs_data_blkaddr
    
    This patch adds sanity check on summary info in recovery and GC flow
    in where the flows rely on them.
    
    After patch:
    [   29.310883] F2FS-fs (loop0): Inconsistent ofs_in_node:65286 in summary, ino:0, nid:6, max:1018
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarWenqing Liu <wenqingliu0120@gmail.com>
    Signed-off-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    c6ad7fd1
recovery.c 22.4 KB