• Chao Yu's avatar
    f2fs: fix to avoid panic in f2fs_inplace_write_data() · da06b18b
    Chao Yu authored
    [ Upstream commit 05573d6c ]
    
    As Jungyeon reported in bugzilla:
    
    https://bugzilla.kernel.org/show_bug.cgi?id=203239
    
    - Overview
    When mounting the attached crafted image and running program, following errors are reported.
    Additionally, it hangs on sync after running program.
    
    The image is intentionally fuzzed from a normal f2fs image for testing.
    Compile options for F2FS are as follows.
    CONFIG_F2FS_FS=y
    CONFIG_F2FS_STAT_FS=y
    CONFIG_F2FS_FS_XATTR=y
    CONFIG_F2FS_FS_POSIX_ACL=y
    CONFIG_F2FS_CHECK_FS=y
    
    - Reproduces
    cc poc_15.c
    ./run.sh f2fs
    sync
    
    - Kernel messages
     ------------[ cut here ]------------
     kernel BUG at fs/f2fs/segment.c:3162!
     RIP: 0010:f2fs_inplace_write_data+0x12d/0x160
     Call Trace:
      f2fs_do_write_data_page+0x3c1/0x820
      __write_data_page+0x156/0x720
      f2fs_write_cache_pages+0x20d/0x460
      f2fs_write_data_pages+0x1b4/0x300
      do_writepages+0x15/0x60
      __filemap_fdatawrite_range+0x7c/0xb0
      file_write_and_wait_range+0x2c/0x80
      f2fs_do_sync_file+0x102/0x810
      do_fsync+0x33/0x60
      __x64_sys_fsync+0xb/0x10
      do_syscall_64+0x43/0xf0
      entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    The reason is f2fs_inplace_write_data() will trigger kernel panic due
    to data block locates in node type segment.
    
    To avoid panic, let's just return error code and set SBI_NEED_FSCK to
    give a hint to fsck for latter repairing.
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    da06b18b
segment.c 113 KB