31 Jan, 2019

1 commit

  • commit 0ea295dd853e0879a9a30ab61f923c26be35b902 upstream.

    The function truncate_node frees the page with f2fs_put_page. However,
    the page index is read after that. So, the patch reads the index before
    freeing the page.

    Fixes: bf39c00a9a7f ("f2fs: drop obsolete node page when it is truncated")
    Cc:
    Signed-off-by: Pan Bian
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Pan Bian
     

10 Jan, 2019

1 commit

  • commit 88960068f25fcc3759455d85460234dcc9d43fef upstream.

    Treat "block_count" from struct f2fs_super_block as 64-bit little endian
    value in sanity_check_raw_super() because struct f2fs_super_block
    declares "block_count" as "__le64".

    This fixes a bug where the superblock validation fails on big endian
    devices with the following error:
    F2FS-fs (sda1): Wrong segment_count / block_count (61439 > 0)
    F2FS-fs (sda1): Can't find valid F2FS filesystem in 1th superblock
    F2FS-fs (sda1): Wrong segment_count / block_count (61439 > 0)
    F2FS-fs (sda1): Can't find valid F2FS filesystem in 2th superblock
    As result of this the partition cannot be mounted.

    With this patch applied the superblock validation works fine and the
    partition can be mounted again:
    F2FS-fs (sda1): Mounted with checkpoint version = 7c84

    My little endian x86-64 hardware was able to mount the partition without
    this fix.
    To confirm that mounting f2fs filesystems works on big endian machines
    again I tested this on a 32-bit MIPS big endian (lantiq) device.

    Fixes: 0cfe75c5b01199 ("f2fs: enhance sanity_check_raw_super() to avoid potential overflows")
    Cc: stable@vger.kernel.org
    Signed-off-by: Martin Blumenstingl
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Martin Blumenstingl
     

13 Dec, 2018

1 commit

  • commit 91291e9998d208370eb8156c760691b873bd7522 upstream.

    This patch adds f2fs_is_valid_blkaddr() in below functions to do sanity
    check with block address to avoid pentential panic:
    - f2fs_grab_read_bio()
    - __written_first_block()

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

    - Reproduce

    - POC (poc.c)
    #define _GNU_SOURCE
    #include
    #include
    #include
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #include
    #include

    static void activity(char *mpoint) {

    char *xattr;
    int err;

    err = asprintf(&xattr, "%s/foo/bar/xattr", mpoint);

    char buf2[113];
    memset(buf2, 0, sizeof(buf2));
    listxattr(xattr, buf2, sizeof(buf2));

    }

    int main(int argc, char *argv[]) {
    activity(argv[1]);
    return 0;
    }

    - kernel message
    [ 844.718738] F2FS-fs (loop0): Mounted with checkpoint version = 2
    [ 846.430929] F2FS-fs (loop0): access invalid blkaddr:1024
    [ 846.431058] WARNING: CPU: 1 PID: 1249 at fs/f2fs/checkpoint.c:154 f2fs_is_valid_blkaddr+0x10f/0x160
    [ 846.431059] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer snd input_leds joydev soundcore serio_raw i2c_piix4 mac_hid ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi autofs4 raid10 raid456 libcrc32c async_raid6_recov async_memcpy async_pq async_xor xor async_tx raid6_pq raid1 raid0 multipath linear qxl ttm crct10dif_pclmul crc32_pclmul drm_kms_helper ghash_clmulni_intel syscopyarea sysfillrect sysimgblt fb_sys_fops pcbc drm 8139too aesni_intel 8139cp floppy psmouse mii aes_x86_64 crypto_simd pata_acpi cryptd glue_helper
    [ 846.431310] CPU: 1 PID: 1249 Comm: a.out Not tainted 4.18.0-rc3+ #1
    [ 846.431312] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 846.431315] RIP: 0010:f2fs_is_valid_blkaddr+0x10f/0x160
    [ 846.431316] Code: 00 eb ed 31 c0 83 fa 05 75 ae 48 83 ec 08 48 8b 3f 89 f1 48 c7 c2 fc 0b 0f 8b 48 c7 c6 8b d7 09 8b 88 44 24 07 e8 61 8b ff ff 0b 0f b6 44 24 07 48 83 c4 08 eb 81 4c 8b 47 10 8b 8f 38 04 00
    [ 846.431347] RSP: 0018:ffff961c414a7bc0 EFLAGS: 00010282
    [ 846.431349] RAX: 0000000000000000 RBX: ffffc5f787b8ea80 RCX: 0000000000000000
    [ 846.431350] RDX: 0000000000000000 RSI: ffff89dfffd165d8 RDI: ffff89dfffd165d8
    [ 846.431351] RBP: ffff961c414a7c20 R08: 0000000000000001 R09: 0000000000000248
    [ 846.431353] R10: 0000000000000000 R11: 0000000000000248 R12: 0000000000000007
    [ 846.431369] R13: ffff89dff5492800 R14: ffff89dfae3aa000 R15: ffff89dff4ff88d0
    [ 846.431372] FS: 00007f882e2fb700(0000) GS:ffff89dfffd00000(0000) knlGS:0000000000000000
    [ 846.431373] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 846.431374] CR2: 0000000001a88008 CR3: 00000001eb572000 CR4: 00000000000006e0
    [ 846.431384] Call Trace:
    [ 846.431426] f2fs_iget+0x6f4/0xe70
    [ 846.431430] ? f2fs_find_entry+0x71/0x90
    [ 846.431432] f2fs_lookup+0x1aa/0x390
    [ 846.431452] __lookup_slow+0x97/0x150
    [ 846.431459] lookup_slow+0x35/0x50
    [ 846.431462] walk_component+0x1c6/0x470
    [ 846.431479] ? memcg_kmem_charge_memcg+0x70/0x90
    [ 846.431488] ? page_add_file_rmap+0x13/0x200
    [ 846.431491] path_lookupat+0x76/0x230
    [ 846.431501] ? __alloc_pages_nodemask+0xfc/0x280
    [ 846.431504] filename_lookup+0xb8/0x1a0
    [ 846.431534] ? _cond_resched+0x16/0x40
    [ 846.431541] ? kmem_cache_alloc+0x160/0x1d0
    [ 846.431549] ? path_listxattr+0x41/0xa0
    [ 846.431551] path_listxattr+0x41/0xa0
    [ 846.431570] do_syscall_64+0x55/0x100
    [ 846.431583] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 846.431607] RIP: 0033:0x7f882de1c0d7
    [ 846.431607] Code: f0 ff ff 73 01 c3 48 8b 0d be dd 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 b8 c2 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 91 dd 2b 00 f7 d8 64 89 01 48
    [ 846.431639] RSP: 002b:00007ffe8e66c238 EFLAGS: 00000202 ORIG_RAX: 00000000000000c2
    [ 846.431641] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f882de1c0d7
    [ 846.431642] RDX: 0000000000000071 RSI: 00007ffe8e66c280 RDI: 0000000001a880c0
    [ 846.431643] RBP: 00007ffe8e66c300 R08: 0000000001a88010 R09: 0000000000000000
    [ 846.431645] R10: 00000000000001ab R11: 0000000000000202 R12: 0000000000400550
    [ 846.431646] R13: 00007ffe8e66c400 R14: 0000000000000000 R15: 0000000000000000
    [ 846.431648] ---[ end trace abca54df39d14f5c ]---
    [ 846.431651] F2FS-fs (loop0): invalid blkaddr: 1024, type: 5, run fsck to fix.
    [ 846.431762] WARNING: CPU: 1 PID: 1249 at fs/f2fs/f2fs.h:2697 f2fs_iget+0xd17/0xe70
    [ 846.431763] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer snd input_leds joydev soundcore serio_raw i2c_piix4 mac_hid ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi autofs4 raid10 raid456 libcrc32c async_raid6_recov async_memcpy async_pq async_xor xor async_tx raid6_pq raid1 raid0 multipath linear qxl ttm crct10dif_pclmul crc32_pclmul drm_kms_helper ghash_clmulni_intel syscopyarea sysfillrect sysimgblt fb_sys_fops pcbc drm 8139too aesni_intel 8139cp floppy psmouse mii aes_x86_64 crypto_simd pata_acpi cryptd glue_helper
    [ 846.431797] CPU: 1 PID: 1249 Comm: a.out Tainted: G W 4.18.0-rc3+ #1
    [ 846.431798] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 846.431800] RIP: 0010:f2fs_iget+0xd17/0xe70
    [ 846.431801] Code: ff ff 48 63 d8 e9 e1 f6 ff ff 48 8b 45 c8 41 b8 05 00 00 00 48 c7 c2 d8 e8 0e 8b 48 c7 c6 1d b0 0a 8b 48 8b 38 e8 f9 b4 00 00 0b 48 8b 45 c8 f0 80 48 48 04 e9 d8 f9 ff ff 0f 0b 48 8b 43 18
    [ 846.431832] RSP: 0018:ffff961c414a7bd0 EFLAGS: 00010282
    [ 846.431834] RAX: 0000000000000000 RBX: ffffc5f787b8ea80 RCX: 0000000000000006
    [ 846.431835] RDX: 0000000000000000 RSI: 0000000000000096 RDI: ffff89dfffd165d0
    [ 846.431836] RBP: ffff961c414a7c20 R08: 0000000000000000 R09: 0000000000000273
    [ 846.431837] R10: 0000000000000000 R11: ffff89dfad50ca60 R12: 0000000000000007
    [ 846.431838] R13: ffff89dff5492800 R14: ffff89dfae3aa000 R15: ffff89dff4ff88d0
    [ 846.431840] FS: 00007f882e2fb700(0000) GS:ffff89dfffd00000(0000) knlGS:0000000000000000
    [ 846.431841] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 846.431842] CR2: 0000000001a88008 CR3: 00000001eb572000 CR4: 00000000000006e0
    [ 846.431846] Call Trace:
    [ 846.431850] ? f2fs_find_entry+0x71/0x90
    [ 846.431853] f2fs_lookup+0x1aa/0x390
    [ 846.431856] __lookup_slow+0x97/0x150
    [ 846.431858] lookup_slow+0x35/0x50
    [ 846.431874] walk_component+0x1c6/0x470
    [ 846.431878] ? memcg_kmem_charge_memcg+0x70/0x90
    [ 846.431880] ? page_add_file_rmap+0x13/0x200
    [ 846.431882] path_lookupat+0x76/0x230
    [ 846.431884] ? __alloc_pages_nodemask+0xfc/0x280
    [ 846.431886] filename_lookup+0xb8/0x1a0
    [ 846.431890] ? _cond_resched+0x16/0x40
    [ 846.431891] ? kmem_cache_alloc+0x160/0x1d0
    [ 846.431894] ? path_listxattr+0x41/0xa0
    [ 846.431896] path_listxattr+0x41/0xa0
    [ 846.431898] do_syscall_64+0x55/0x100
    [ 846.431901] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 846.431902] RIP: 0033:0x7f882de1c0d7
    [ 846.431903] Code: f0 ff ff 73 01 c3 48 8b 0d be dd 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 b8 c2 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 91 dd 2b 00 f7 d8 64 89 01 48
    [ 846.431934] RSP: 002b:00007ffe8e66c238 EFLAGS: 00000202 ORIG_RAX: 00000000000000c2
    [ 846.431936] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f882de1c0d7
    [ 846.431937] RDX: 0000000000000071 RSI: 00007ffe8e66c280 RDI: 0000000001a880c0
    [ 846.431939] RBP: 00007ffe8e66c300 R08: 0000000001a88010 R09: 0000000000000000
    [ 846.431940] R10: 00000000000001ab R11: 0000000000000202 R12: 0000000000400550
    [ 846.431941] R13: 00007ffe8e66c400 R14: 0000000000000000 R15: 0000000000000000
    [ 846.431943] ---[ end trace abca54df39d14f5d ]---
    [ 846.432033] F2FS-fs (loop0): access invalid blkaddr:1024
    [ 846.432051] WARNING: CPU: 1 PID: 1249 at fs/f2fs/checkpoint.c:154 f2fs_is_valid_blkaddr+0x10f/0x160
    [ 846.432051] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer snd input_leds joydev soundcore serio_raw i2c_piix4 mac_hid ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi autofs4 raid10 raid456 libcrc32c async_raid6_recov async_memcpy async_pq async_xor xor async_tx raid6_pq raid1 raid0 multipath linear qxl ttm crct10dif_pclmul crc32_pclmul drm_kms_helper ghash_clmulni_intel syscopyarea sysfillrect sysimgblt fb_sys_fops pcbc drm 8139too aesni_intel 8139cp floppy psmouse mii aes_x86_64 crypto_simd pata_acpi cryptd glue_helper
    [ 846.432085] CPU: 1 PID: 1249 Comm: a.out Tainted: G W 4.18.0-rc3+ #1
    [ 846.432086] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 846.432089] RIP: 0010:f2fs_is_valid_blkaddr+0x10f/0x160
    [ 846.432089] Code: 00 eb ed 31 c0 83 fa 05 75 ae 48 83 ec 08 48 8b 3f 89 f1 48 c7 c2 fc 0b 0f 8b 48 c7 c6 8b d7 09 8b 88 44 24 07 e8 61 8b ff ff 0b 0f b6 44 24 07 48 83 c4 08 eb 81 4c 8b 47 10 8b 8f 38 04 00
    [ 846.432120] RSP: 0018:ffff961c414a7900 EFLAGS: 00010286
    [ 846.432122] RAX: 0000000000000000 RBX: 0000000000000400 RCX: 0000000000000006
    [ 846.432123] RDX: 0000000000000000 RSI: 0000000000000096 RDI: ffff89dfffd165d0
    [ 846.432124] RBP: ffff89dff5492800 R08: 0000000000000001 R09: 000000000000029d
    [ 846.432125] R10: ffff961c414a7820 R11: 000000000000029d R12: 0000000000000400
    [ 846.432126] R13: 0000000000000000 R14: ffff89dff4ff88d0 R15: 0000000000000000
    [ 846.432128] FS: 00007f882e2fb700(0000) GS:ffff89dfffd00000(0000) knlGS:0000000000000000
    [ 846.432130] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 846.432131] CR2: 0000000001a88008 CR3: 00000001eb572000 CR4: 00000000000006e0
    [ 846.432135] Call Trace:
    [ 846.432151] f2fs_wait_on_block_writeback+0x20/0x110
    [ 846.432158] f2fs_grab_read_bio+0xbc/0xe0
    [ 846.432161] f2fs_submit_page_read+0x21/0x280
    [ 846.432163] f2fs_get_read_data_page+0xb7/0x3c0
    [ 846.432165] f2fs_get_lock_data_page+0x29/0x1e0
    [ 846.432167] f2fs_get_new_data_page+0x148/0x550
    [ 846.432170] f2fs_add_regular_entry+0x1d2/0x550
    [ 846.432178] ? __switch_to+0x12f/0x460
    [ 846.432181] f2fs_add_dentry+0x6a/0xd0
    [ 846.432184] f2fs_do_add_link+0xe9/0x140
    [ 846.432186] __recover_dot_dentries+0x260/0x280
    [ 846.432189] f2fs_lookup+0x343/0x390
    [ 846.432193] __lookup_slow+0x97/0x150
    [ 846.432195] lookup_slow+0x35/0x50
    [ 846.432208] walk_component+0x1c6/0x470
    [ 846.432212] ? memcg_kmem_charge_memcg+0x70/0x90
    [ 846.432215] ? page_add_file_rmap+0x13/0x200
    [ 846.432217] path_lookupat+0x76/0x230
    [ 846.432219] ? __alloc_pages_nodemask+0xfc/0x280
    [ 846.432221] filename_lookup+0xb8/0x1a0
    [ 846.432224] ? _cond_resched+0x16/0x40
    [ 846.432226] ? kmem_cache_alloc+0x160/0x1d0
    [ 846.432228] ? path_listxattr+0x41/0xa0
    [ 846.432230] path_listxattr+0x41/0xa0
    [ 846.432233] do_syscall_64+0x55/0x100
    [ 846.432235] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 846.432237] RIP: 0033:0x7f882de1c0d7
    [ 846.432237] Code: f0 ff ff 73 01 c3 48 8b 0d be dd 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 b8 c2 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 91 dd 2b 00 f7 d8 64 89 01 48
    [ 846.432269] RSP: 002b:00007ffe8e66c238 EFLAGS: 00000202 ORIG_RAX: 00000000000000c2
    [ 846.432271] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f882de1c0d7
    [ 846.432272] RDX: 0000000000000071 RSI: 00007ffe8e66c280 RDI: 0000000001a880c0
    [ 846.432273] RBP: 00007ffe8e66c300 R08: 0000000001a88010 R09: 0000000000000000
    [ 846.432274] R10: 00000000000001ab R11: 0000000000000202 R12: 0000000000400550
    [ 846.432275] R13: 00007ffe8e66c400 R14: 0000000000000000 R15: 0000000000000000
    [ 846.432277] ---[ end trace abca54df39d14f5e ]---
    [ 846.432279] F2FS-fs (loop0): invalid blkaddr: 1024, type: 5, run fsck to fix.
    [ 846.432376] WARNING: CPU: 1 PID: 1249 at fs/f2fs/f2fs.h:2697 f2fs_wait_on_block_writeback+0xb1/0x110
    [ 846.432376] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer snd input_leds joydev soundcore serio_raw i2c_piix4 mac_hid ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi autofs4 raid10 raid456 libcrc32c async_raid6_recov async_memcpy async_pq async_xor xor async_tx raid6_pq raid1 raid0 multipath linear qxl ttm crct10dif_pclmul crc32_pclmul drm_kms_helper ghash_clmulni_intel syscopyarea sysfillrect sysimgblt fb_sys_fops pcbc drm 8139too aesni_intel 8139cp floppy psmouse mii aes_x86_64 crypto_simd pata_acpi cryptd glue_helper
    [ 846.432410] CPU: 1 PID: 1249 Comm: a.out Tainted: G W 4.18.0-rc3+ #1
    [ 846.432411] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 846.432413] RIP: 0010:f2fs_wait_on_block_writeback+0xb1/0x110
    [ 846.432414] Code: 66 90 f0 ff 4b 34 74 59 5b 5d c3 48 8b 7d 00 41 b8 05 00 00 00 89 d9 48 c7 c2 d8 e8 0e 8b 48 c7 c6 1d b0 0a 8b e8 df bc fd ff 0b f0 80 4d 48 04 e9 67 ff ff ff 48 8b 03 48 c1 e8 37 83 e0 07
    [ 846.432445] RSP: 0018:ffff961c414a7910 EFLAGS: 00010286
    [ 846.432447] RAX: 0000000000000000 RBX: 0000000000000400 RCX: 0000000000000006
    [ 846.432448] RDX: 0000000000000000 RSI: 0000000000000092 RDI: ffff89dfffd165d0
    [ 846.432449] RBP: ffff89dff5492800 R08: 0000000000000000 R09: 00000000000002d1
    [ 846.432450] R10: ffff961c414a7820 R11: ffff89dfad50cf80 R12: 0000000000000400
    [ 846.432451] R13: 0000000000000000 R14: ffff89dff4ff88d0 R15: 0000000000000000
    [ 846.432453] FS: 00007f882e2fb700(0000) GS:ffff89dfffd00000(0000) knlGS:0000000000000000
    [ 846.432454] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 846.432455] CR2: 0000000001a88008 CR3: 00000001eb572000 CR4: 00000000000006e0
    [ 846.432459] Call Trace:
    [ 846.432463] f2fs_grab_read_bio+0xbc/0xe0
    [ 846.432464] f2fs_submit_page_read+0x21/0x280
    [ 846.432466] f2fs_get_read_data_page+0xb7/0x3c0
    [ 846.432468] f2fs_get_lock_data_page+0x29/0x1e0
    [ 846.432470] f2fs_get_new_data_page+0x148/0x550
    [ 846.432473] f2fs_add_regular_entry+0x1d2/0x550
    [ 846.432475] ? __switch_to+0x12f/0x460
    [ 846.432477] f2fs_add_dentry+0x6a/0xd0
    [ 846.432480] f2fs_do_add_link+0xe9/0x140
    [ 846.432483] __recover_dot_dentries+0x260/0x280
    [ 846.432485] f2fs_lookup+0x343/0x390
    [ 846.432488] __lookup_slow+0x97/0x150
    [ 846.432490] lookup_slow+0x35/0x50
    [ 846.432505] walk_component+0x1c6/0x470
    [ 846.432509] ? memcg_kmem_charge_memcg+0x70/0x90
    [ 846.432511] ? page_add_file_rmap+0x13/0x200
    [ 846.432513] path_lookupat+0x76/0x230
    [ 846.432515] ? __alloc_pages_nodemask+0xfc/0x280
    [ 846.432517] filename_lookup+0xb8/0x1a0
    [ 846.432520] ? _cond_resched+0x16/0x40
    [ 846.432522] ? kmem_cache_alloc+0x160/0x1d0
    [ 846.432525] ? path_listxattr+0x41/0xa0
    [ 846.432526] path_listxattr+0x41/0xa0
    [ 846.432529] do_syscall_64+0x55/0x100
    [ 846.432531] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 846.432533] RIP: 0033:0x7f882de1c0d7
    [ 846.432533] Code: f0 ff ff 73 01 c3 48 8b 0d be dd 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 b8 c2 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 91 dd 2b 00 f7 d8 64 89 01 48
    [ 846.432565] RSP: 002b:00007ffe8e66c238 EFLAGS: 00000202 ORIG_RAX: 00000000000000c2
    [ 846.432567] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f882de1c0d7
    [ 846.432568] RDX: 0000000000000071 RSI: 00007ffe8e66c280 RDI: 0000000001a880c0
    [ 846.432569] RBP: 00007ffe8e66c300 R08: 0000000001a88010 R09: 0000000000000000
    [ 846.432570] R10: 00000000000001ab R11: 0000000000000202 R12: 0000000000400550
    [ 846.432571] R13: 00007ffe8e66c400 R14: 0000000000000000 R15: 0000000000000000
    [ 846.432573] ---[ end trace abca54df39d14f5f ]---
    [ 846.434280] BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    [ 846.434424] PGD 80000001ebd3a067 P4D 80000001ebd3a067 PUD 1eb1ae067 PMD 0
    [ 846.434551] Oops: 0000 [#1] SMP PTI
    [ 846.434697] CPU: 0 PID: 44 Comm: kworker/u5:0 Tainted: G W 4.18.0-rc3+ #1
    [ 846.434805] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 846.435000] Workqueue: fscrypt_read_queue decrypt_work
    [ 846.435174] RIP: 0010:fscrypt_do_page_crypto+0x6e/0x2d0
    [ 846.435351] Code: 00 65 48 8b 04 25 28 00 00 00 48 89 84 24 88 00 00 00 31 c0 e8 43 c2 e0 ff 49 8b 86 48 02 00 00 85 ed c7 44 24 70 00 00 00 00 8b 58 08 0f 84 14 02 00 00 48 8b 78 10 48 8b 0c 24 48 c7 84 24
    [ 846.435696] RSP: 0018:ffff961c40f9bd60 EFLAGS: 00010206
    [ 846.435870] RAX: 0000000000000000 RBX: ffffc5f787719b80 RCX: ffffc5f787719b80
    [ 846.436051] RDX: ffffffff8b9f4b88 RSI: ffffffff8b0ae622 RDI: ffff961c40f9bdb8
    [ 846.436261] RBP: 0000000000001000 R08: ffffc5f787719b80 R09: 0000000000001000
    [ 846.436433] R10: 0000000000000018 R11: fefefefefefefeff R12: ffffc5f787719b80
    [ 846.436562] R13: ffffc5f787719b80 R14: ffff89dff4ff88d0 R15: 0ffff89dfaddee60
    [ 846.436658] FS: 0000000000000000(0000) GS:ffff89dfffc00000(0000) knlGS:0000000000000000
    [ 846.436758] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 846.436898] CR2: 0000000000000008 CR3: 00000001eddd0000 CR4: 00000000000006f0
    [ 846.437001] Call Trace:
    [ 846.437181] ? check_preempt_wakeup+0xf2/0x230
    [ 846.437276] ? check_preempt_curr+0x7c/0x90
    [ 846.437370] fscrypt_decrypt_page+0x48/0x4d
    [ 846.437466] __fscrypt_decrypt_bio+0x5b/0x90
    [ 846.437542] decrypt_work+0x12/0x20
    [ 846.437651] process_one_work+0x15e/0x3d0
    [ 846.437740] worker_thread+0x4c/0x440
    [ 846.437848] kthread+0xf8/0x130
    [ 846.437938] ? rescuer_thread+0x350/0x350
    [ 846.438022] ? kthread_associate_blkcg+0x90/0x90
    [ 846.438117] ret_from_fork+0x35/0x40
    [ 846.438201] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer snd input_leds joydev soundcore serio_raw i2c_piix4 mac_hid ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi autofs4 raid10 raid456 libcrc32c async_raid6_recov async_memcpy async_pq async_xor xor async_tx raid6_pq raid1 raid0 multipath linear qxl ttm crct10dif_pclmul crc32_pclmul drm_kms_helper ghash_clmulni_intel syscopyarea sysfillrect sysimgblt fb_sys_fops pcbc drm 8139too aesni_intel 8139cp floppy psmouse mii aes_x86_64 crypto_simd pata_acpi cryptd glue_helper
    [ 846.438653] CR2: 0000000000000008
    [ 846.438713] ---[ end trace abca54df39d14f60 ]---
    [ 846.438796] RIP: 0010:fscrypt_do_page_crypto+0x6e/0x2d0
    [ 846.438844] Code: 00 65 48 8b 04 25 28 00 00 00 48 89 84 24 88 00 00 00 31 c0 e8 43 c2 e0 ff 49 8b 86 48 02 00 00 85 ed c7 44 24 70 00 00 00 00 8b 58 08 0f 84 14 02 00 00 48 8b 78 10 48 8b 0c 24 48 c7 84 24
    [ 846.439084] RSP: 0018:ffff961c40f9bd60 EFLAGS: 00010206
    [ 846.439176] RAX: 0000000000000000 RBX: ffffc5f787719b80 RCX: ffffc5f787719b80
    [ 846.440927] RDX: ffffffff8b9f4b88 RSI: ffffffff8b0ae622 RDI: ffff961c40f9bdb8
    [ 846.442083] RBP: 0000000000001000 R08: ffffc5f787719b80 R09: 0000000000001000
    [ 846.443284] R10: 0000000000000018 R11: fefefefefefefeff R12: ffffc5f787719b80
    [ 846.444448] R13: ffffc5f787719b80 R14: ffff89dff4ff88d0 R15: 0ffff89dfaddee60
    [ 846.445558] FS: 0000000000000000(0000) GS:ffff89dfffc00000(0000) knlGS:0000000000000000
    [ 846.446687] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 846.447796] CR2: 0000000000000008 CR3: 00000001eddd0000 CR4: 00000000000006f0

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc4/source/fs/crypto/crypto.c#L149
    struct crypto_skcipher *tfm = ci->ci_ctfm;
    Here ci can be NULL

    Note that this issue maybe require CONFIG_F2FS_FS_ENCRYPTION=y to reproduce.

    Reported-by Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14: adjust context]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     

06 Dec, 2018

14 commits

  • commit 89d13c38501df730cbb2e02c4499da1b5187119d upstream.

    This patch fixes missing up_read call.

    Fixes: c9b60788fc76 ("f2fs: fix to do sanity check with block address in main area")
    Cc: # 4.19+
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     
  • commit e494c2f995d6181d6e29c4927d68e0f295ecf75b upstream.

    After fuzzing, cp_pack_start_sum could be corrupted, so current log's
    summary info should be wrong due to loading incorrect summary block.
    Then, if segment's type in current log is exceeded NR_CURSEG_TYPE, it
    can lead accessing invalid dirty_i->dirty_segmap bitmap finally.

    Add sanity check for cp_pack_start_sum to fix this issue.

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

    - Reproduce

    - Kernel message (f2fs-dev w/ KASAN)
    [ 3117.578432] F2FS-fs (loop0): Invalid log blocks per segment (8)

    [ 3117.578445] F2FS-fs (loop0): Can't find valid F2FS filesystem in 2th superblock
    [ 3117.581364] F2FS-fs (loop0): invalid crc_offset: 30716
    [ 3117.583564] WARNING: CPU: 1 PID: 1225 at fs/f2fs/checkpoint.c:90 __get_meta_page+0x448/0x4b0
    [ 3117.583570] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer joydev input_leds serio_raw snd soundcore mac_hid i2c_piix4 ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi btrfs zstd_decompress zstd_compress xxhash raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid1 raid0 multipath linear 8139too qxl ttm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel psmouse aes_x86_64 8139cp crypto_simd cryptd mii glue_helper pata_acpi floppy
    [ 3117.584014] CPU: 1 PID: 1225 Comm: mount Not tainted 4.17.0+ #1
    [ 3117.584017] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 3117.584022] RIP: 0010:__get_meta_page+0x448/0x4b0
    [ 3117.584023] Code: 00 49 8d bc 24 84 00 00 00 e8 74 54 da ff 41 83 8c 24 84 00 00 00 08 4c 89 f6 4c 89 ef e8 c0 d9 95 00 48 89 ef e8 18 e3 00 00 0b f0 80 4d 48 04 e9 0f fe ff ff 0f 0b 48 89 c7 48 89 04 24 e8
    [ 3117.584072] RSP: 0018:ffff88018eb678c0 EFLAGS: 00010286
    [ 3117.584082] RAX: ffff88018f0a6a78 RBX: ffffea0007a46600 RCX: ffffffff9314d1b2
    [ 3117.584085] RDX: ffffffff00000001 RSI: 0000000000000000 RDI: ffff88018f0a6a98
    [ 3117.584087] RBP: ffff88018ebe9980 R08: 0000000000000002 R09: 0000000000000001
    [ 3117.584090] R10: 0000000000000001 R11: ffffed00326e4450 R12: ffff880193722200
    [ 3117.584092] R13: ffff88018ebe9afc R14: 0000000000000206 R15: ffff88018eb67900
    [ 3117.584096] FS: 00007f5694636840(0000) GS:ffff8801f3b00000(0000) knlGS:0000000000000000
    [ 3117.584098] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 3117.584101] CR2: 00000000016f21b8 CR3: 0000000191c22000 CR4: 00000000000006e0
    [ 3117.584112] Call Trace:
    [ 3117.584121] ? f2fs_set_meta_page_dirty+0x150/0x150
    [ 3117.584127] ? f2fs_build_segment_manager+0xbf9/0x3190
    [ 3117.584133] ? f2fs_npages_for_summary_flush+0x75/0x120
    [ 3117.584145] f2fs_build_segment_manager+0xda8/0x3190
    [ 3117.584151] ? f2fs_get_valid_checkpoint+0x298/0xa00
    [ 3117.584156] ? f2fs_flush_sit_entries+0x10e0/0x10e0
    [ 3117.584184] ? map_id_range_down+0x17c/0x1b0
    [ 3117.584188] ? __put_user_ns+0x30/0x30
    [ 3117.584206] ? find_next_bit+0x53/0x90
    [ 3117.584237] ? cpumask_next+0x16/0x20
    [ 3117.584249] f2fs_fill_super+0x1948/0x2b40
    [ 3117.584258] ? f2fs_commit_super+0x1a0/0x1a0
    [ 3117.584279] ? sget_userns+0x65e/0x690
    [ 3117.584296] ? set_blocksize+0x88/0x130
    [ 3117.584302] ? f2fs_commit_super+0x1a0/0x1a0
    [ 3117.584305] mount_bdev+0x1c0/0x200
    [ 3117.584310] mount_fs+0x5c/0x190
    [ 3117.584320] vfs_kern_mount+0x64/0x190
    [ 3117.584330] do_mount+0x2e4/0x1450
    [ 3117.584343] ? lockref_put_return+0x130/0x130
    [ 3117.584347] ? copy_mount_string+0x20/0x20
    [ 3117.584357] ? kasan_unpoison_shadow+0x31/0x40
    [ 3117.584362] ? kasan_kmalloc+0xa6/0xd0
    [ 3117.584373] ? memcg_kmem_put_cache+0x16/0x90
    [ 3117.584377] ? __kmalloc_track_caller+0x196/0x210
    [ 3117.584383] ? _copy_from_user+0x61/0x90
    [ 3117.584396] ? memdup_user+0x3e/0x60
    [ 3117.584401] ksys_mount+0x7e/0xd0
    [ 3117.584405] __x64_sys_mount+0x62/0x70
    [ 3117.584427] do_syscall_64+0x73/0x160
    [ 3117.584440] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 3117.584455] RIP: 0033:0x7f5693f14b9a
    [ 3117.584456] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 3117.584505] RSP: 002b:00007fff27346488 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 3117.584510] RAX: ffffffffffffffda RBX: 00000000016e2030 RCX: 00007f5693f14b9a
    [ 3117.584512] RDX: 00000000016e2210 RSI: 00000000016e3f30 RDI: 00000000016ee040
    [ 3117.584514] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 3117.584516] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 00000000016ee040
    [ 3117.584519] R13: 00000000016e2210 R14: 0000000000000000 R15: 0000000000000003
    [ 3117.584523] ---[ end trace a8e0d899985faf31 ]---
    [ 3117.685663] F2FS-fs (loop0): f2fs_check_nid_range: out-of-range nid=2, run fsck to fix.
    [ 3117.685673] F2FS-fs (loop0): recover_data: ino = 2 (i_size: recover) recovered = 1, err = 0
    [ 3117.685707] ==================================================================
    [ 3117.685955] BUG: KASAN: slab-out-of-bounds in __remove_dirty_segment+0xdd/0x1e0
    [ 3117.686175] Read of size 8 at addr ffff88018f0a63d0 by task mount/1225

    [ 3117.686477] CPU: 0 PID: 1225 Comm: mount Tainted: G W 4.17.0+ #1
    [ 3117.686481] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 3117.686483] Call Trace:
    [ 3117.686494] dump_stack+0x71/0xab
    [ 3117.686512] print_address_description+0x6b/0x290
    [ 3117.686517] kasan_report+0x28e/0x390
    [ 3117.686522] ? __remove_dirty_segment+0xdd/0x1e0
    [ 3117.686527] __remove_dirty_segment+0xdd/0x1e0
    [ 3117.686532] locate_dirty_segment+0x189/0x190
    [ 3117.686538] f2fs_allocate_new_segments+0xa9/0xe0
    [ 3117.686543] recover_data+0x703/0x2c20
    [ 3117.686547] ? f2fs_recover_fsync_data+0x48f/0xd50
    [ 3117.686553] ? ksys_mount+0x7e/0xd0
    [ 3117.686564] ? policy_nodemask+0x1a/0x90
    [ 3117.686567] ? policy_node+0x56/0x70
    [ 3117.686571] ? add_fsync_inode+0xf0/0xf0
    [ 3117.686592] ? blk_finish_plug+0x44/0x60
    [ 3117.686597] ? f2fs_ra_meta_pages+0x38b/0x5e0
    [ 3117.686602] ? find_inode_fast+0xac/0xc0
    [ 3117.686606] ? f2fs_is_valid_blkaddr+0x320/0x320
    [ 3117.686618] ? __radix_tree_lookup+0x150/0x150
    [ 3117.686633] ? dqget+0x670/0x670
    [ 3117.686648] ? pagecache_get_page+0x29/0x410
    [ 3117.686656] ? kmem_cache_alloc+0x176/0x1e0
    [ 3117.686660] ? f2fs_is_valid_blkaddr+0x11d/0x320
    [ 3117.686664] f2fs_recover_fsync_data+0xc23/0xd50
    [ 3117.686670] ? f2fs_space_for_roll_forward+0x60/0x60
    [ 3117.686674] ? rb_insert_color+0x323/0x3d0
    [ 3117.686678] ? f2fs_recover_orphan_inodes+0xa5/0x700
    [ 3117.686683] ? proc_register+0x153/0x1d0
    [ 3117.686686] ? f2fs_remove_orphan_inode+0x10/0x10
    [ 3117.686695] ? f2fs_attr_store+0x50/0x50
    [ 3117.686700] ? proc_create_single_data+0x52/0x60
    [ 3117.686707] f2fs_fill_super+0x1d06/0x2b40
    [ 3117.686728] ? f2fs_commit_super+0x1a0/0x1a0
    [ 3117.686735] ? sget_userns+0x65e/0x690
    [ 3117.686740] ? set_blocksize+0x88/0x130
    [ 3117.686745] ? f2fs_commit_super+0x1a0/0x1a0
    [ 3117.686748] mount_bdev+0x1c0/0x200
    [ 3117.686753] mount_fs+0x5c/0x190
    [ 3117.686758] vfs_kern_mount+0x64/0x190
    [ 3117.686762] do_mount+0x2e4/0x1450
    [ 3117.686769] ? lockref_put_return+0x130/0x130
    [ 3117.686773] ? copy_mount_string+0x20/0x20
    [ 3117.686777] ? kasan_unpoison_shadow+0x31/0x40
    [ 3117.686780] ? kasan_kmalloc+0xa6/0xd0
    [ 3117.686786] ? memcg_kmem_put_cache+0x16/0x90
    [ 3117.686790] ? __kmalloc_track_caller+0x196/0x210
    [ 3117.686795] ? _copy_from_user+0x61/0x90
    [ 3117.686801] ? memdup_user+0x3e/0x60
    [ 3117.686804] ksys_mount+0x7e/0xd0
    [ 3117.686809] __x64_sys_mount+0x62/0x70
    [ 3117.686816] do_syscall_64+0x73/0x160
    [ 3117.686824] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 3117.686829] RIP: 0033:0x7f5693f14b9a
    [ 3117.686830] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 3117.686887] RSP: 002b:00007fff27346488 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 3117.686892] RAX: ffffffffffffffda RBX: 00000000016e2030 RCX: 00007f5693f14b9a
    [ 3117.686894] RDX: 00000000016e2210 RSI: 00000000016e3f30 RDI: 00000000016ee040
    [ 3117.686896] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 3117.686899] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 00000000016ee040
    [ 3117.686901] R13: 00000000016e2210 R14: 0000000000000000 R15: 0000000000000003

    [ 3117.687005] Allocated by task 1225:
    [ 3117.687152] kasan_kmalloc+0xa6/0xd0
    [ 3117.687157] kmem_cache_alloc_trace+0xfd/0x200
    [ 3117.687161] f2fs_build_segment_manager+0x2d09/0x3190
    [ 3117.687165] f2fs_fill_super+0x1948/0x2b40
    [ 3117.687168] mount_bdev+0x1c0/0x200
    [ 3117.687171] mount_fs+0x5c/0x190
    [ 3117.687174] vfs_kern_mount+0x64/0x190
    [ 3117.687177] do_mount+0x2e4/0x1450
    [ 3117.687180] ksys_mount+0x7e/0xd0
    [ 3117.687182] __x64_sys_mount+0x62/0x70
    [ 3117.687186] do_syscall_64+0x73/0x160
    [ 3117.687190] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 3117.687285] Freed by task 19:
    [ 3117.687412] __kasan_slab_free+0x137/0x190
    [ 3117.687416] kfree+0x8b/0x1b0
    [ 3117.687460] ttm_bo_man_put_node+0x61/0x80 [ttm]
    [ 3117.687476] ttm_bo_cleanup_refs+0x15f/0x250 [ttm]
    [ 3117.687492] ttm_bo_delayed_delete+0x2f0/0x300 [ttm]
    [ 3117.687507] ttm_bo_delayed_workqueue+0x17/0x50 [ttm]
    [ 3117.687528] process_one_work+0x2f9/0x740
    [ 3117.687531] worker_thread+0x78/0x6b0
    [ 3117.687541] kthread+0x177/0x1c0
    [ 3117.687545] ret_from_fork+0x35/0x40

    [ 3117.687638] The buggy address belongs to the object at ffff88018f0a6300
    which belongs to the cache kmalloc-192 of size 192
    [ 3117.688014] The buggy address is located 16 bytes to the right of
    192-byte region [ffff88018f0a6300, ffff88018f0a63c0)
    [ 3117.688382] The buggy address belongs to the page:
    [ 3117.688554] page:ffffea00063c2980 count:1 mapcount:0 mapping:ffff8801f3403180 index:0x0
    [ 3117.688788] flags: 0x17fff8000000100(slab)
    [ 3117.688944] raw: 017fff8000000100 ffffea00063c2840 0000000e0000000e ffff8801f3403180
    [ 3117.689166] raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000
    [ 3117.689386] page dumped because: kasan: bad access detected

    [ 3117.689653] Memory state around the buggy address:
    [ 3117.689816] ffff88018f0a6280: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [ 3117.690027] ffff88018f0a6300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [ 3117.690239] >ffff88018f0a6380: 00 00 fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [ 3117.690448] ^
    [ 3117.690644] ffff88018f0a6400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [ 3117.690868] ffff88018f0a6480: 00 00 fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [ 3117.691077] ==================================================================
    [ 3117.691290] Disabling lock debugging due to kernel taint
    [ 3117.693893] BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
    [ 3117.694120] PGD 80000001f01bc067 P4D 80000001f01bc067 PUD 1d9638067 PMD 0
    [ 3117.694338] Oops: 0002 [#1] SMP KASAN PTI
    [ 3117.694490] CPU: 1 PID: 1225 Comm: mount Tainted: G B W 4.17.0+ #1
    [ 3117.694703] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 3117.695073] RIP: 0010:__remove_dirty_segment+0xe2/0x1e0
    [ 3117.695246] Code: c4 48 89 c7 e8 cf bb d7 ff 45 0f b6 24 24 41 83 e4 3f 44 88 64 24 07 41 83 e4 3f 4a 8d 7c e3 08 e8 b3 bc d7 ff 4a 8b 4c e3 08 4c 0f b3 29 0f 82 94 00 00 00 48 8d bd 20 04 00 00 e8 97 bb d7
    [ 3117.695793] RSP: 0018:ffff88018eb67638 EFLAGS: 00010292
    [ 3117.695969] RAX: 0000000000000000 RBX: ffff88018f0a6300 RCX: 0000000000000000
    [ 3117.696182] RDX: 0000000000000000 RSI: 0000000000000297 RDI: 0000000000000297
    [ 3117.696391] RBP: ffff88018ebe9980 R08: ffffed003e743ebb R09: ffffed003e743ebb
    [ 3117.696604] R10: 0000000000000001 R11: ffffed003e743eba R12: 0000000000000019
    [ 3117.696813] R13: 0000000000000014 R14: 0000000000000320 R15: ffff88018ebe99e0
    [ 3117.697032] FS: 00007f5694636840(0000) GS:ffff8801f3b00000(0000) knlGS:0000000000000000
    [ 3117.697280] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 3117.702357] CR2: 00007fe89bb1a000 CR3: 0000000191c22000 CR4: 00000000000006e0
    [ 3117.707235] Call Trace:
    [ 3117.712077] locate_dirty_segment+0x189/0x190
    [ 3117.716891] f2fs_allocate_new_segments+0xa9/0xe0
    [ 3117.721617] recover_data+0x703/0x2c20
    [ 3117.726316] ? f2fs_recover_fsync_data+0x48f/0xd50
    [ 3117.730957] ? ksys_mount+0x7e/0xd0
    [ 3117.735573] ? policy_nodemask+0x1a/0x90
    [ 3117.740198] ? policy_node+0x56/0x70
    [ 3117.744829] ? add_fsync_inode+0xf0/0xf0
    [ 3117.749487] ? blk_finish_plug+0x44/0x60
    [ 3117.754152] ? f2fs_ra_meta_pages+0x38b/0x5e0
    [ 3117.758831] ? find_inode_fast+0xac/0xc0
    [ 3117.763448] ? f2fs_is_valid_blkaddr+0x320/0x320
    [ 3117.768046] ? __radix_tree_lookup+0x150/0x150
    [ 3117.772603] ? dqget+0x670/0x670
    [ 3117.777159] ? pagecache_get_page+0x29/0x410
    [ 3117.781648] ? kmem_cache_alloc+0x176/0x1e0
    [ 3117.786067] ? f2fs_is_valid_blkaddr+0x11d/0x320
    [ 3117.790476] f2fs_recover_fsync_data+0xc23/0xd50
    [ 3117.794790] ? f2fs_space_for_roll_forward+0x60/0x60
    [ 3117.799086] ? rb_insert_color+0x323/0x3d0
    [ 3117.803304] ? f2fs_recover_orphan_inodes+0xa5/0x700
    [ 3117.807563] ? proc_register+0x153/0x1d0
    [ 3117.811766] ? f2fs_remove_orphan_inode+0x10/0x10
    [ 3117.815947] ? f2fs_attr_store+0x50/0x50
    [ 3117.820087] ? proc_create_single_data+0x52/0x60
    [ 3117.824262] f2fs_fill_super+0x1d06/0x2b40
    [ 3117.828367] ? f2fs_commit_super+0x1a0/0x1a0
    [ 3117.832432] ? sget_userns+0x65e/0x690
    [ 3117.836500] ? set_blocksize+0x88/0x130
    [ 3117.840501] ? f2fs_commit_super+0x1a0/0x1a0
    [ 3117.844420] mount_bdev+0x1c0/0x200
    [ 3117.848275] mount_fs+0x5c/0x190
    [ 3117.852053] vfs_kern_mount+0x64/0x190
    [ 3117.855810] do_mount+0x2e4/0x1450
    [ 3117.859441] ? lockref_put_return+0x130/0x130
    [ 3117.862996] ? copy_mount_string+0x20/0x20
    [ 3117.866417] ? kasan_unpoison_shadow+0x31/0x40
    [ 3117.869719] ? kasan_kmalloc+0xa6/0xd0
    [ 3117.872948] ? memcg_kmem_put_cache+0x16/0x90
    [ 3117.876121] ? __kmalloc_track_caller+0x196/0x210
    [ 3117.879333] ? _copy_from_user+0x61/0x90
    [ 3117.882467] ? memdup_user+0x3e/0x60
    [ 3117.885604] ksys_mount+0x7e/0xd0
    [ 3117.888700] __x64_sys_mount+0x62/0x70
    [ 3117.891742] do_syscall_64+0x73/0x160
    [ 3117.894692] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 3117.897669] RIP: 0033:0x7f5693f14b9a
    [ 3117.900563] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 3117.906922] RSP: 002b:00007fff27346488 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 3117.910159] RAX: ffffffffffffffda RBX: 00000000016e2030 RCX: 00007f5693f14b9a
    [ 3117.913469] RDX: 00000000016e2210 RSI: 00000000016e3f30 RDI: 00000000016ee040
    [ 3117.916764] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 3117.920071] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 00000000016ee040
    [ 3117.923393] R13: 00000000016e2210 R14: 0000000000000000 R15: 0000000000000003
    [ 3117.926680] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer joydev input_leds serio_raw snd soundcore mac_hid i2c_piix4 ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi btrfs zstd_decompress zstd_compress xxhash raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid1 raid0 multipath linear 8139too qxl ttm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel psmouse aes_x86_64 8139cp crypto_simd cryptd mii glue_helper pata_acpi floppy
    [ 3117.949979] CR2: 0000000000000000
    [ 3117.954283] ---[ end trace a8e0d899985faf32 ]---
    [ 3117.958575] RIP: 0010:__remove_dirty_segment+0xe2/0x1e0
    [ 3117.962810] Code: c4 48 89 c7 e8 cf bb d7 ff 45 0f b6 24 24 41 83 e4 3f 44 88 64 24 07 41 83 e4 3f 4a 8d 7c e3 08 e8 b3 bc d7 ff 4a 8b 4c e3 08 4c 0f b3 29 0f 82 94 00 00 00 48 8d bd 20 04 00 00 e8 97 bb d7
    [ 3117.971789] RSP: 0018:ffff88018eb67638 EFLAGS: 00010292
    [ 3117.976333] RAX: 0000000000000000 RBX: ffff88018f0a6300 RCX: 0000000000000000
    [ 3117.980926] RDX: 0000000000000000 RSI: 0000000000000297 RDI: 0000000000000297
    [ 3117.985497] RBP: ffff88018ebe9980 R08: ffffed003e743ebb R09: ffffed003e743ebb
    [ 3117.990098] R10: 0000000000000001 R11: ffffed003e743eba R12: 0000000000000019
    [ 3117.994761] R13: 0000000000000014 R14: 0000000000000320 R15: ffff88018ebe99e0
    [ 3117.999392] FS: 00007f5694636840(0000) GS:ffff8801f3b00000(0000) knlGS:0000000000000000
    [ 3118.004096] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 3118.008816] CR2: 00007fe89bb1a000 CR3: 0000000191c22000 CR4: 00000000000006e0

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc3/source/fs/f2fs/segment.c#L775
    if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
    dirty_i->nr_dirty[t]--;
    Here dirty_i->dirty_segmap[t] can be NULL which leads to crash in test_and_clear_bit()

    Reported-by Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14: The function is called sanity_check_ckpt()]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit 18dd6470c2d14d10f5a2dd926925dc80dbd3abfd upstream.

    If inode.i_extra_isize was fuzzed to an abnormal value, when
    calculating inline data size, the result will overflow, result
    in accessing invalid memory area when operating inline data.

    Let's do sanity check with i_extra_isize during inode loading
    for fixing.

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

    - Reproduce

    - POC (poc.c)
    #define _GNU_SOURCE
    #include
    #include
    #include
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #include
    #include

    static void activity(char *mpoint) {

    char *foo_bar_baz;
    char *foo_baz;
    char *xattr;
    int err;

    err = asprintf(&foo_bar_baz, "%s/foo/bar/baz", mpoint);
    err = asprintf(&foo_baz, "%s/foo/baz", mpoint);
    err = asprintf(&xattr, "%s/foo/bar/xattr", mpoint);

    rename(foo_bar_baz, foo_baz);

    char buf2[113];
    memset(buf2, 0, sizeof(buf2));
    listxattr(xattr, buf2, sizeof(buf2));
    removexattr(xattr, "user.mime_type");

    }

    int main(int argc, char *argv[]) {
    activity(argv[1]);
    return 0;
    }

    - Kernel message
    Umount the image will leave the following message
    [ 2910.995489] F2FS-fs (loop0): Mounted with checkpoint version = 2
    [ 2918.416465] ==================================================================
    [ 2918.416807] BUG: KASAN: slab-out-of-bounds in f2fs_iget+0xcb9/0x1a80
    [ 2918.417009] Read of size 4 at addr ffff88018efc2068 by task a.out/1229

    [ 2918.417311] CPU: 1 PID: 1229 Comm: a.out Not tainted 4.17.0+ #1
    [ 2918.417314] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 2918.417323] Call Trace:
    [ 2918.417366] dump_stack+0x71/0xab
    [ 2918.417401] print_address_description+0x6b/0x290
    [ 2918.417407] kasan_report+0x28e/0x390
    [ 2918.417411] ? f2fs_iget+0xcb9/0x1a80
    [ 2918.417415] f2fs_iget+0xcb9/0x1a80
    [ 2918.417422] ? f2fs_lookup+0x2e7/0x580
    [ 2918.417425] f2fs_lookup+0x2e7/0x580
    [ 2918.417433] ? __recover_dot_dentries+0x400/0x400
    [ 2918.417447] ? legitimize_path.isra.29+0x5a/0xa0
    [ 2918.417453] __lookup_slow+0x11c/0x220
    [ 2918.417457] ? may_delete+0x2a0/0x2a0
    [ 2918.417475] ? deref_stack_reg+0xe0/0xe0
    [ 2918.417479] ? __lookup_hash+0xb0/0xb0
    [ 2918.417483] lookup_slow+0x3e/0x60
    [ 2918.417488] walk_component+0x3ac/0x990
    [ 2918.417492] ? generic_permission+0x51/0x1e0
    [ 2918.417495] ? inode_permission+0x51/0x1d0
    [ 2918.417499] ? pick_link+0x3e0/0x3e0
    [ 2918.417502] ? link_path_walk+0x4b1/0x770
    [ 2918.417513] ? _raw_spin_lock_irqsave+0x25/0x50
    [ 2918.417518] ? walk_component+0x990/0x990
    [ 2918.417522] ? path_init+0x2e6/0x580
    [ 2918.417526] path_lookupat+0x13f/0x430
    [ 2918.417531] ? trailing_symlink+0x3a0/0x3a0
    [ 2918.417534] ? do_renameat2+0x270/0x7b0
    [ 2918.417538] ? __kasan_slab_free+0x14c/0x190
    [ 2918.417541] ? do_renameat2+0x270/0x7b0
    [ 2918.417553] ? kmem_cache_free+0x85/0x1e0
    [ 2918.417558] ? do_renameat2+0x270/0x7b0
    [ 2918.417563] filename_lookup+0x13c/0x280
    [ 2918.417567] ? filename_parentat+0x2b0/0x2b0
    [ 2918.417572] ? kasan_unpoison_shadow+0x31/0x40
    [ 2918.417575] ? kasan_kmalloc+0xa6/0xd0
    [ 2918.417593] ? strncpy_from_user+0xaa/0x1c0
    [ 2918.417598] ? getname_flags+0x101/0x2b0
    [ 2918.417614] ? path_listxattr+0x87/0x110
    [ 2918.417619] path_listxattr+0x87/0x110
    [ 2918.417623] ? listxattr+0xc0/0xc0
    [ 2918.417637] ? mm_fault_error+0x1b0/0x1b0
    [ 2918.417654] do_syscall_64+0x73/0x160
    [ 2918.417660] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 2918.417676] RIP: 0033:0x7f2f3a3480d7
    [ 2918.417677] Code: f0 ff ff 73 01 c3 48 8b 0d be dd 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 b8 c2 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 91 dd 2b 00 f7 d8 64 89 01 48
    [ 2918.417732] RSP: 002b:00007fff4095b7d8 EFLAGS: 00000206 ORIG_RAX: 00000000000000c2
    [ 2918.417744] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f2f3a3480d7
    [ 2918.417746] RDX: 0000000000000071 RSI: 00007fff4095b810 RDI: 000000000126a0c0
    [ 2918.417749] RBP: 00007fff4095b890 R08: 000000000126a010 R09: 0000000000000000
    [ 2918.417751] R10: 00000000000001ab R11: 0000000000000206 R12: 00000000004005e0
    [ 2918.417753] R13: 00007fff4095b990 R14: 0000000000000000 R15: 0000000000000000

    [ 2918.417853] Allocated by task 329:
    [ 2918.418002] kasan_kmalloc+0xa6/0xd0
    [ 2918.418007] kmem_cache_alloc+0xc8/0x1e0
    [ 2918.418023] mempool_init_node+0x194/0x230
    [ 2918.418027] mempool_init+0x12/0x20
    [ 2918.418042] bioset_init+0x2bd/0x380
    [ 2918.418052] blk_alloc_queue_node+0xe9/0x540
    [ 2918.418075] dm_create+0x2c0/0x800
    [ 2918.418080] dev_create+0xd2/0x530
    [ 2918.418083] ctl_ioctl+0x2a3/0x5b0
    [ 2918.418087] dm_ctl_ioctl+0xa/0x10
    [ 2918.418092] do_vfs_ioctl+0x13e/0x8c0
    [ 2918.418095] ksys_ioctl+0x66/0x70
    [ 2918.418098] __x64_sys_ioctl+0x3d/0x50
    [ 2918.418102] do_syscall_64+0x73/0x160
    [ 2918.418106] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 2918.418204] Freed by task 0:
    [ 2918.418301] (stack is not available)

    [ 2918.418521] The buggy address belongs to the object at ffff88018efc0000
    which belongs to the cache biovec-max of size 8192
    [ 2918.418894] The buggy address is located 104 bytes to the right of
    8192-byte region [ffff88018efc0000, ffff88018efc2000)
    [ 2918.419257] The buggy address belongs to the page:
    [ 2918.419431] page:ffffea00063bf000 count:1 mapcount:0 mapping:ffff8801f2242540 index:0x0 compound_mapcount: 0
    [ 2918.419702] flags: 0x17fff8000008100(slab|head)
    [ 2918.419879] raw: 017fff8000008100 dead000000000100 dead000000000200 ffff8801f2242540
    [ 2918.420101] raw: 0000000000000000 0000000000030003 00000001ffffffff 0000000000000000
    [ 2918.420322] page dumped because: kasan: bad access detected

    [ 2918.420599] Memory state around the buggy address:
    [ 2918.420764] ffff88018efc1f00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 2918.420975] ffff88018efc1f80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 2918.421194] >ffff88018efc2000: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [ 2918.421406] ^
    [ 2918.421627] ffff88018efc2080: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    [ 2918.421838] ffff88018efc2100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 2918.422046] ==================================================================
    [ 2918.422264] Disabling lock debugging due to kernel taint
    [ 2923.901641] BUG: unable to handle kernel paging request at ffff88018f0db000
    [ 2923.901884] PGD 22226a067 P4D 22226a067 PUD 222273067 PMD 18e642063 PTE 800000018f0db061
    [ 2923.902120] Oops: 0003 [#1] SMP KASAN PTI
    [ 2923.902274] CPU: 1 PID: 1231 Comm: umount Tainted: G B 4.17.0+ #1
    [ 2923.902490] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 2923.902761] RIP: 0010:__memset+0x24/0x30
    [ 2923.902906] Code: 90 90 90 90 90 90 66 66 90 66 90 49 89 f9 48 89 d1 83 e2 07 48 c1 e9 03 40 0f b6 f6 48 b8 01 01 01 01 01 01 01 01 48 0f af c6 48 ab 89 d1 f3 aa 4c 89 c8 c3 90 49 89 f9 40 88 f0 48 89 d1 f3
    [ 2923.903446] RSP: 0018:ffff88018ddf7ae0 EFLAGS: 00010206
    [ 2923.903622] RAX: 0000000000000000 RBX: ffff8801d549d888 RCX: 1ffffffffffdaffb
    [ 2923.903833] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88018f0daffc
    [ 2923.904062] RBP: ffff88018efc206c R08: 1ffff10031df840d R09: ffff88018efc206c
    [ 2923.904273] R10: ffffffffffffe1ee R11: ffffed0031df65fa R12: 0000000000000000
    [ 2923.904485] R13: ffff8801d549dc98 R14: 00000000ffffc3db R15: ffffea00063bec80
    [ 2923.904693] FS: 00007fa8b2f8a840(0000) GS:ffff8801f3b00000(0000) knlGS:0000000000000000
    [ 2923.904937] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 2923.910080] CR2: ffff88018f0db000 CR3: 000000018f892000 CR4: 00000000000006e0
    [ 2923.914930] Call Trace:
    [ 2923.919724] f2fs_truncate_inline_inode+0x114/0x170
    [ 2923.924487] f2fs_truncate_blocks+0x11b/0x7c0
    [ 2923.929178] ? f2fs_truncate_data_blocks+0x10/0x10
    [ 2923.933834] ? dqget+0x670/0x670
    [ 2923.938437] ? f2fs_destroy_extent_tree+0xd6/0x270
    [ 2923.943107] ? __radix_tree_lookup+0x2f/0x150
    [ 2923.947772] f2fs_truncate+0xd4/0x1a0
    [ 2923.952491] f2fs_evict_inode+0x5ab/0x610
    [ 2923.957204] evict+0x15f/0x280
    [ 2923.961898] __dentry_kill+0x161/0x250
    [ 2923.966634] shrink_dentry_list+0xf3/0x250
    [ 2923.971897] shrink_dcache_parent+0xa9/0x100
    [ 2923.976561] ? shrink_dcache_sb+0x1f0/0x1f0
    [ 2923.981177] ? wait_for_completion+0x8a/0x210
    [ 2923.985781] ? migrate_swap_stop+0x2d0/0x2d0
    [ 2923.990332] do_one_tree+0xe/0x40
    [ 2923.994735] shrink_dcache_for_umount+0x3a/0xa0
    [ 2923.999077] generic_shutdown_super+0x3e/0x1c0
    [ 2924.003350] kill_block_super+0x4b/0x70
    [ 2924.007619] deactivate_locked_super+0x65/0x90
    [ 2924.011812] cleanup_mnt+0x5c/0xa0
    [ 2924.015995] task_work_run+0xce/0xf0
    [ 2924.020174] exit_to_usermode_loop+0x115/0x120
    [ 2924.024293] do_syscall_64+0x12f/0x160
    [ 2924.028479] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 2924.032709] RIP: 0033:0x7fa8b2868487
    [ 2924.036888] Code: 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 31 f6 e9 09 00 00 00 66 0f 1f 84 00 00 00 00 00 b8 a6 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d e1 c9 2b 00 f7 d8 64 89 01 48
    [ 2924.045750] RSP: 002b:00007ffc39824d58 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
    [ 2924.050190] RAX: 0000000000000000 RBX: 00000000008ea030 RCX: 00007fa8b2868487
    [ 2924.054604] RDX: 0000000000000001 RSI: 0000000000000000 RDI: 00000000008f4360
    [ 2924.058940] RBP: 00000000008f4360 R08: 0000000000000000 R09: 0000000000000014
    [ 2924.063186] R10: 00000000000006b2 R11: 0000000000000246 R12: 00007fa8b2d7183c
    [ 2924.067418] R13: 0000000000000000 R14: 00000000008ea210 R15: 00007ffc39824fe0
    [ 2924.071534] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm snd_timer joydev input_leds serio_raw snd soundcore mac_hid i2c_piix4 ib_iser rdma_cm iw_cm ib_cm ib_core configfs iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi btrfs zstd_decompress zstd_compress xxhash raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid1 raid0 multipath linear 8139too qxl ttm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel psmouse aes_x86_64 8139cp crypto_simd cryptd mii glue_helper pata_acpi floppy
    [ 2924.098044] CR2: ffff88018f0db000
    [ 2924.102520] ---[ end trace a8e0d899985faf31 ]---
    [ 2924.107012] RIP: 0010:__memset+0x24/0x30
    [ 2924.111448] Code: 90 90 90 90 90 90 66 66 90 66 90 49 89 f9 48 89 d1 83 e2 07 48 c1 e9 03 40 0f b6 f6 48 b8 01 01 01 01 01 01 01 01 48 0f af c6 48 ab 89 d1 f3 aa 4c 89 c8 c3 90 49 89 f9 40 88 f0 48 89 d1 f3
    [ 2924.120724] RSP: 0018:ffff88018ddf7ae0 EFLAGS: 00010206
    [ 2924.125312] RAX: 0000000000000000 RBX: ffff8801d549d888 RCX: 1ffffffffffdaffb
    [ 2924.129931] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88018f0daffc
    [ 2924.134537] RBP: ffff88018efc206c R08: 1ffff10031df840d R09: ffff88018efc206c
    [ 2924.139175] R10: ffffffffffffe1ee R11: ffffed0031df65fa R12: 0000000000000000
    [ 2924.143825] R13: ffff8801d549dc98 R14: 00000000ffffc3db R15: ffffea00063bec80
    [ 2924.148500] FS: 00007fa8b2f8a840(0000) GS:ffff8801f3b00000(0000) knlGS:0000000000000000
    [ 2924.153247] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 2924.158003] CR2: ffff88018f0db000 CR3: 000000018f892000 CR4: 00000000000006e0
    [ 2924.164641] BUG: Bad rss-counter state mm:00000000fa04621e idx:0 val:4
    [ 2924.170007] BUG: Bad rss-counter
    tate mm:00000000fa04621e idx:1 val:2

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc3/source/fs/f2fs/inline.c#L78
    memset(addr + from, 0, MAX_INLINE_DATA(inode) - from);
    Here the length can be negative.

    Reported-by Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14: adjust context]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit c9b60788fc760d136211853f10ce73dc152d1f4a upstream.

    This patch add to do sanity check with below field:
    - cp_pack_total_block_count
    - blkaddr of data/node
    - extent info

    - Overview
    BUG() in verify_block_addr() when writing to a corrupted f2fs image

    - Reproduce (4.18 upstream kernel)

    - POC (poc.c)

    static void activity(char *mpoint) {

    char *foo_bar_baz;
    int err;

    static int buf[8192];
    memset(buf, 0, sizeof(buf));

    err = asprintf(&foo_bar_baz, "%s/foo/bar/baz", mpoint);

    int fd = open(foo_bar_baz, O_RDWR | O_TRUNC, 0777);
    if (fd >= 0) {
    write(fd, (char *)buf, sizeof(buf));
    fdatasync(fd);
    close(fd);
    }
    }

    int main(int argc, char *argv[]) {
    activity(argv[1]);
    return 0;
    }

    - Kernel message
    [ 689.349473] F2FS-fs (loop0): Mounted with checkpoint version = 3
    [ 699.728662] WARNING: CPU: 0 PID: 1309 at fs/f2fs/segment.c:2860 f2fs_inplace_write_data+0x232/0x240
    [ 699.728670] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 699.729056] CPU: 0 PID: 1309 Comm: a.out Not tainted 4.18.0-rc1+ #4
    [ 699.729064] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 699.729074] RIP: 0010:f2fs_inplace_write_data+0x232/0x240
    [ 699.729076] Code: ff e9 cf fe ff ff 49 8d 7d 10 e8 39 45 ad ff 4d 8b 7d 10 be 04 00 00 00 49 8d 7f 48 e8 07 49 ad ff 45 8b 7f 48 e9 fb fe ff ff 0b f0 41 80 4d 48 04 e9 65 fe ff ff 90 66 66 66 66 90 55 48 8d
    [ 699.729130] RSP: 0018:ffff8801f43af568 EFLAGS: 00010202
    [ 699.729139] RAX: 000000000000003f RBX: ffff8801f43af7b8 RCX: ffffffffb88c9113
    [ 699.729142] RDX: 0000000000000003 RSI: dffffc0000000000 RDI: ffff8802024e5540
    [ 699.729144] RBP: ffff8801f43af590 R08: 0000000000000009 R09: ffffffffffffffe8
    [ 699.729147] R10: 0000000000000001 R11: ffffed0039b0596a R12: ffff8802024e5540
    [ 699.729149] R13: ffff8801f0335500 R14: ffff8801e3e7a700 R15: ffff8801e1ee4450
    [ 699.729154] FS: 00007f9bf97f5700(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 699.729156] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 699.729159] CR2: 00007f9bf925d170 CR3: 00000001f0c34000 CR4: 00000000000006f0
    [ 699.729171] Call Trace:
    [ 699.729192] f2fs_do_write_data_page+0x2e2/0xe00
    [ 699.729203] ? f2fs_should_update_outplace+0xd0/0xd0
    [ 699.729238] ? memcg_drain_all_list_lrus+0x280/0x280
    [ 699.729269] ? __radix_tree_replace+0xa3/0x120
    [ 699.729276] __write_data_page+0x5c7/0xe30
    [ 699.729291] ? kasan_check_read+0x11/0x20
    [ 699.729310] ? page_mapped+0x8a/0x110
    [ 699.729321] ? page_mkclean+0xe9/0x160
    [ 699.729327] ? f2fs_do_write_data_page+0xe00/0xe00
    [ 699.729331] ? invalid_page_referenced_vma+0x130/0x130
    [ 699.729345] ? clear_page_dirty_for_io+0x332/0x450
    [ 699.729351] f2fs_write_cache_pages+0x4ca/0x860
    [ 699.729358] ? __write_data_page+0xe30/0xe30
    [ 699.729374] ? percpu_counter_add_batch+0x22/0xa0
    [ 699.729380] ? kasan_check_write+0x14/0x20
    [ 699.729391] ? _raw_spin_lock+0x17/0x40
    [ 699.729403] ? f2fs_mark_inode_dirty_sync.part.18+0x16/0x30
    [ 699.729413] ? iov_iter_advance+0x113/0x640
    [ 699.729418] ? f2fs_write_end+0x133/0x2e0
    [ 699.729423] ? balance_dirty_pages_ratelimited+0x239/0x640
    [ 699.729428] f2fs_write_data_pages+0x329/0x520
    [ 699.729433] ? generic_perform_write+0x250/0x320
    [ 699.729438] ? f2fs_write_cache_pages+0x860/0x860
    [ 699.729454] ? current_time+0x110/0x110
    [ 699.729459] ? f2fs_preallocate_blocks+0x1ef/0x370
    [ 699.729464] do_writepages+0x37/0xb0
    [ 699.729468] ? f2fs_write_cache_pages+0x860/0x860
    [ 699.729472] ? do_writepages+0x37/0xb0
    [ 699.729478] __filemap_fdatawrite_range+0x19a/0x1f0
    [ 699.729483] ? delete_from_page_cache_batch+0x4e0/0x4e0
    [ 699.729496] ? __vfs_write+0x2b2/0x410
    [ 699.729501] file_write_and_wait_range+0x66/0xb0
    [ 699.729506] f2fs_do_sync_file+0x1f9/0xd90
    [ 699.729511] ? truncate_partial_data_page+0x290/0x290
    [ 699.729521] ? __sb_end_write+0x30/0x50
    [ 699.729526] ? vfs_write+0x20f/0x260
    [ 699.729530] f2fs_sync_file+0x9a/0xb0
    [ 699.729534] ? f2fs_do_sync_file+0xd90/0xd90
    [ 699.729548] vfs_fsync_range+0x68/0x100
    [ 699.729554] ? __fget_light+0xc9/0xe0
    [ 699.729558] do_fsync+0x3d/0x70
    [ 699.729562] __x64_sys_fdatasync+0x24/0x30
    [ 699.729585] do_syscall_64+0x78/0x170
    [ 699.729595] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 699.729613] RIP: 0033:0x7f9bf930d800
    [ 699.729615] Code: 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 83 3d 49 bf 2c 00 00 75 10 b8 4b 00 00 00 0f 05 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 be 78 01 00 48 89 04 24
    [ 699.729668] RSP: 002b:00007ffee3606c68 EFLAGS: 00000246 ORIG_RAX: 000000000000004b
    [ 699.729673] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f9bf930d800
    [ 699.729675] RDX: 0000000000008000 RSI: 00000000006010a0 RDI: 0000000000000003
    [ 699.729678] RBP: 00007ffee3606ca0 R08: 0000000001503010 R09: 0000000000000000
    [ 699.729680] R10: 00000000000002e8 R11: 0000000000000246 R12: 0000000000400610
    [ 699.729683] R13: 00007ffee3606da0 R14: 0000000000000000 R15: 0000000000000000
    [ 699.729687] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 699.729782] ------------[ cut here ]------------
    [ 699.729785] kernel BUG at fs/f2fs/segment.h:654!
    [ 699.731055] invalid opcode: 0000 [#1] SMP KASAN PTI
    [ 699.732104] CPU: 0 PID: 1309 Comm: a.out Tainted: G W 4.18.0-rc1+ #4
    [ 699.733684] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 699.735611] RIP: 0010:f2fs_submit_page_bio+0x29b/0x730
    [ 699.736649] Code: 54 49 8d bd 18 04 00 00 e8 b2 59 af ff 41 8b 8d 18 04 00 00 8b 45 b8 41 d3 e6 44 01 f0 4c 8d 73 14 41 39 c7 0f 82 37 fe ff ff 0b 65 8b 05 2c 04 77 47 89 c0 48 0f a3 05 52 c1 d5 01 0f 92 c0
    [ 699.740524] RSP: 0018:ffff8801f43af508 EFLAGS: 00010283
    [ 699.741573] RAX: 0000000000000000 RBX: ffff8801f43af7b8 RCX: ffffffffb88a7cef
    [ 699.743006] RDX: 0000000000000007 RSI: dffffc0000000000 RDI: ffff8801e3e7a64c
    [ 699.744426] RBP: ffff8801f43af558 R08: ffffed003e066b55 R09: ffffed003e066b55
    [ 699.745833] R10: 0000000000000001 R11: ffffed003e066b54 R12: ffffea0007876940
    [ 699.747256] R13: ffff8801f0335500 R14: ffff8801e3e7a600 R15: 0000000000000001
    [ 699.748683] FS: 00007f9bf97f5700(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 699.750293] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 699.751462] CR2: 00007f9bf925d170 CR3: 00000001f0c34000 CR4: 00000000000006f0
    [ 699.752874] Call Trace:
    [ 699.753386] ? f2fs_inplace_write_data+0x93/0x240
    [ 699.754341] f2fs_inplace_write_data+0xd2/0x240
    [ 699.755271] f2fs_do_write_data_page+0x2e2/0xe00
    [ 699.756214] ? f2fs_should_update_outplace+0xd0/0xd0
    [ 699.757215] ? memcg_drain_all_list_lrus+0x280/0x280
    [ 699.758209] ? __radix_tree_replace+0xa3/0x120
    [ 699.759164] __write_data_page+0x5c7/0xe30
    [ 699.760002] ? kasan_check_read+0x11/0x20
    [ 699.760823] ? page_mapped+0x8a/0x110
    [ 699.761573] ? page_mkclean+0xe9/0x160
    [ 699.762345] ? f2fs_do_write_data_page+0xe00/0xe00
    [ 699.763332] ? invalid_page_referenced_vma+0x130/0x130
    [ 699.764374] ? clear_page_dirty_for_io+0x332/0x450
    [ 699.765347] f2fs_write_cache_pages+0x4ca/0x860
    [ 699.766276] ? __write_data_page+0xe30/0xe30
    [ 699.767161] ? percpu_counter_add_batch+0x22/0xa0
    [ 699.768112] ? kasan_check_write+0x14/0x20
    [ 699.768951] ? _raw_spin_lock+0x17/0x40
    [ 699.769739] ? f2fs_mark_inode_dirty_sync.part.18+0x16/0x30
    [ 699.770885] ? iov_iter_advance+0x113/0x640
    [ 699.771743] ? f2fs_write_end+0x133/0x2e0
    [ 699.772569] ? balance_dirty_pages_ratelimited+0x239/0x640
    [ 699.773680] f2fs_write_data_pages+0x329/0x520
    [ 699.774603] ? generic_perform_write+0x250/0x320
    [ 699.775544] ? f2fs_write_cache_pages+0x860/0x860
    [ 699.776510] ? current_time+0x110/0x110
    [ 699.777299] ? f2fs_preallocate_blocks+0x1ef/0x370
    [ 699.778279] do_writepages+0x37/0xb0
    [ 699.779026] ? f2fs_write_cache_pages+0x860/0x860
    [ 699.779978] ? do_writepages+0x37/0xb0
    [ 699.780755] __filemap_fdatawrite_range+0x19a/0x1f0
    [ 699.781746] ? delete_from_page_cache_batch+0x4e0/0x4e0
    [ 699.782820] ? __vfs_write+0x2b2/0x410
    [ 699.783597] file_write_and_wait_range+0x66/0xb0
    [ 699.784540] f2fs_do_sync_file+0x1f9/0xd90
    [ 699.785381] ? truncate_partial_data_page+0x290/0x290
    [ 699.786415] ? __sb_end_write+0x30/0x50
    [ 699.787204] ? vfs_write+0x20f/0x260
    [ 699.787941] f2fs_sync_file+0x9a/0xb0
    [ 699.788694] ? f2fs_do_sync_file+0xd90/0xd90
    [ 699.789572] vfs_fsync_range+0x68/0x100
    [ 699.790360] ? __fget_light+0xc9/0xe0
    [ 699.791128] do_fsync+0x3d/0x70
    [ 699.791779] __x64_sys_fdatasync+0x24/0x30
    [ 699.792614] do_syscall_64+0x78/0x170
    [ 699.793371] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 699.794406] RIP: 0033:0x7f9bf930d800
    [ 699.795134] Code: 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 83 3d 49 bf 2c 00 00 75 10 b8 4b 00 00 00 0f 05 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 be 78 01 00 48 89 04 24
    [ 699.798960] RSP: 002b:00007ffee3606c68 EFLAGS: 00000246 ORIG_RAX: 000000000000004b
    [ 699.800483] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f9bf930d800
    [ 699.801923] RDX: 0000000000008000 RSI: 00000000006010a0 RDI: 0000000000000003
    [ 699.803373] RBP: 00007ffee3606ca0 R08: 0000000001503010 R09: 0000000000000000
    [ 699.804798] R10: 00000000000002e8 R11: 0000000000000246 R12: 0000000000400610
    [ 699.806233] R13: 00007ffee3606da0 R14: 0000000000000000 R15: 0000000000000000
    [ 699.807667] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 699.817079] ---[ end trace 4ce02f25ff7d3df6 ]---
    [ 699.818068] RIP: 0010:f2fs_submit_page_bio+0x29b/0x730
    [ 699.819114] Code: 54 49 8d bd 18 04 00 00 e8 b2 59 af ff 41 8b 8d 18 04 00 00 8b 45 b8 41 d3 e6 44 01 f0 4c 8d 73 14 41 39 c7 0f 82 37 fe ff ff 0b 65 8b 05 2c 04 77 47 89 c0 48 0f a3 05 52 c1 d5 01 0f 92 c0
    [ 699.822919] RSP: 0018:ffff8801f43af508 EFLAGS: 00010283
    [ 699.823977] RAX: 0000000000000000 RBX: ffff8801f43af7b8 RCX: ffffffffb88a7cef
    [ 699.825436] RDX: 0000000000000007 RSI: dffffc0000000000 RDI: ffff8801e3e7a64c
    [ 699.826881] RBP: ffff8801f43af558 R08: ffffed003e066b55 R09: ffffed003e066b55
    [ 699.828292] R10: 0000000000000001 R11: ffffed003e066b54 R12: ffffea0007876940
    [ 699.829750] R13: ffff8801f0335500 R14: ffff8801e3e7a600 R15: 0000000000000001
    [ 699.831192] FS: 00007f9bf97f5700(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 699.832793] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 699.833981] CR2: 00007f9bf925d170 CR3: 00000001f0c34000 CR4: 00000000000006f0
    [ 699.835556] ==================================================================
    [ 699.837029] BUG: KASAN: stack-out-of-bounds in update_stack_state+0x38c/0x3e0
    [ 699.838462] Read of size 8 at addr ffff8801f43af970 by task a.out/1309

    [ 699.840086] CPU: 0 PID: 1309 Comm: a.out Tainted: G D W 4.18.0-rc1+ #4
    [ 699.841603] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 699.843475] Call Trace:
    [ 699.843982] dump_stack+0x7b/0xb5
    [ 699.844661] print_address_description+0x70/0x290
    [ 699.845607] kasan_report+0x291/0x390
    [ 699.846351] ? update_stack_state+0x38c/0x3e0
    [ 699.853831] __asan_load8+0x54/0x90
    [ 699.854569] update_stack_state+0x38c/0x3e0
    [ 699.855428] ? __read_once_size_nocheck.constprop.7+0x20/0x20
    [ 699.856601] ? __save_stack_trace+0x5e/0x100
    [ 699.857476] unwind_next_frame.part.5+0x18e/0x490
    [ 699.858448] ? unwind_dump+0x290/0x290
    [ 699.859217] ? clear_page_dirty_for_io+0x332/0x450
    [ 699.860185] __unwind_start+0x106/0x190
    [ 699.860974] __save_stack_trace+0x5e/0x100
    [ 699.861808] ? __save_stack_trace+0x5e/0x100
    [ 699.862691] ? unlink_anon_vmas+0xba/0x2c0
    [ 699.863525] save_stack_trace+0x1f/0x30
    [ 699.864312] save_stack+0x46/0xd0
    [ 699.864993] ? __alloc_pages_slowpath+0x1420/0x1420
    [ 699.865990] ? flush_tlb_mm_range+0x15e/0x220
    [ 699.866889] ? kasan_check_write+0x14/0x20
    [ 699.867724] ? __dec_node_state+0x92/0xb0
    [ 699.868543] ? lock_page_memcg+0x85/0xf0
    [ 699.869350] ? unlock_page_memcg+0x16/0x80
    [ 699.870185] ? page_remove_rmap+0x198/0x520
    [ 699.871048] ? mark_page_accessed+0x133/0x200
    [ 699.871930] ? _cond_resched+0x1a/0x50
    [ 699.872700] ? unmap_page_range+0xcd4/0xe50
    [ 699.873551] ? rb_next+0x58/0x80
    [ 699.874217] ? rb_next+0x58/0x80
    [ 699.874895] __kasan_slab_free+0x13c/0x1a0
    [ 699.875734] ? unlink_anon_vmas+0xba/0x2c0
    [ 699.876563] kasan_slab_free+0xe/0x10
    [ 699.877315] kmem_cache_free+0x89/0x1e0
    [ 699.878095] unlink_anon_vmas+0xba/0x2c0
    [ 699.878913] free_pgtables+0x101/0x1b0
    [ 699.879677] exit_mmap+0x146/0x2a0
    [ 699.880378] ? __ia32_sys_munmap+0x50/0x50
    [ 699.881214] ? kasan_check_read+0x11/0x20
    [ 699.882052] ? mm_update_next_owner+0x322/0x380
    [ 699.882985] mmput+0x8b/0x1d0
    [ 699.883602] do_exit+0x43a/0x1390
    [ 699.884288] ? mm_update_next_owner+0x380/0x380
    [ 699.885212] ? f2fs_sync_file+0x9a/0xb0
    [ 699.885995] ? f2fs_do_sync_file+0xd90/0xd90
    [ 699.886877] ? vfs_fsync_range+0x68/0x100
    [ 699.887694] ? __fget_light+0xc9/0xe0
    [ 699.888442] ? do_fsync+0x3d/0x70
    [ 699.889118] ? __x64_sys_fdatasync+0x24/0x30
    [ 699.889996] rewind_stack_do_exit+0x17/0x20
    [ 699.890860] RIP: 0033:0x7f9bf930d800
    [ 699.891585] Code: Bad RIP value.
    [ 699.892268] RSP: 002b:00007ffee3606c68 EFLAGS: 00000246 ORIG_RAX: 000000000000004b
    [ 699.893781] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f9bf930d800
    [ 699.895220] RDX: 0000000000008000 RSI: 00000000006010a0 RDI: 0000000000000003
    [ 699.896643] RBP: 00007ffee3606ca0 R08: 0000000001503010 R09: 0000000000000000
    [ 699.898069] R10: 00000000000002e8 R11: 0000000000000246 R12: 0000000000400610
    [ 699.899505] R13: 00007ffee3606da0 R14: 0000000000000000 R15: 0000000000000000

    [ 699.901241] The buggy address belongs to the page:
    [ 699.902215] page:ffffea0007d0ebc0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
    [ 699.903811] flags: 0x2ffff0000000000()
    [ 699.904585] raw: 02ffff0000000000 0000000000000000 ffffffff07d00101 0000000000000000
    [ 699.906125] raw: 0000000000000000 0000000000240000 00000000ffffffff 0000000000000000
    [ 699.907673] page dumped because: kasan: bad access detected

    [ 699.909108] Memory state around the buggy address:
    [ 699.910077] ffff8801f43af800: 00 f1 f1 f1 f1 00 f4 f4 f4 f3 f3 f3 f3 00 00 00
    [ 699.911528] ffff8801f43af880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [ 699.912953] >ffff8801f43af900: 00 00 00 00 00 00 00 00 f1 01 f4 f4 f4 f2 f2 f2
    [ 699.914392] ^
    [ 699.915758] ffff8801f43af980: f2 00 f4 f4 00 00 00 00 f2 00 00 00 00 00 00 00
    [ 699.917193] ffff8801f43afa00: 00 00 00 00 00 00 00 00 00 f3 f3 f3 00 00 00 00
    [ 699.918634] ==================================================================

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc1/source/fs/f2fs/segment.h#L644

    Reported-by Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14:
    - Error label is different in validate_checkpoint() due to the earlier
    backport of "f2fs: fix invalid memory access"
    - Adjust context]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit e34438c903b653daca2b2a7de95aed46226f8ed3 upstream.

    This patch adds to do sanity check with below fields of inode to
    avoid reported panic.
    - node footer
    - iblocks

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

    - Overview
    BUG() triggered in f2fs_truncate_inode_blocks() when un-mounting a mounted f2fs image after writing to it

    - Reproduce

    - POC (poc.c)

    static void activity(char *mpoint) {

    char *foo_bar_baz;
    int err;

    static int buf[8192];
    memset(buf, 0, sizeof(buf));

    err = asprintf(&foo_bar_baz, "%s/foo/bar/baz", mpoint);

    // open / write / read
    int fd = open(foo_bar_baz, O_RDWR | O_TRUNC, 0777);
    if (fd >= 0) {
    write(fd, (char *)buf, 517);
    write(fd, (char *)buf, sizeof(buf));
    close(fd);
    }

    }

    int main(int argc, char *argv[]) {
    activity(argv[1]);
    return 0;
    }

    - Kernel meesage
    [ 552.479723] F2FS-fs (loop0): Mounted with checkpoint version = 2
    [ 556.451891] ------------[ cut here ]------------
    [ 556.451899] kernel BUG at fs/f2fs/node.c:987!
    [ 556.452920] invalid opcode: 0000 [#1] SMP KASAN PTI
    [ 556.453936] CPU: 1 PID: 1310 Comm: umount Not tainted 4.18.0-rc1+ #4
    [ 556.455213] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 556.457140] RIP: 0010:f2fs_truncate_inode_blocks+0x4a7/0x6f0
    [ 556.458280] Code: e8 ae ea ff ff 41 89 c7 c1 e8 1f 84 c0 74 0a 41 83 ff fe 0f 85 35 ff ff ff 81 85 b0 fe ff ff fb 03 00 00 e9 f7 fd ff ff 0f 0b 0b e8 62 b7 9a 00 48 8b bd a0 fe ff ff e8 56 54 ae ff 48 8b b5
    [ 556.462015] RSP: 0018:ffff8801f292f808 EFLAGS: 00010286
    [ 556.463068] RAX: ffffed003e73242d RBX: ffff8801f292f958 RCX: ffffffffb88b81bc
    [ 556.464479] RDX: 0000000000000000 RSI: 0000000000000004 RDI: ffff8801f3992164
    [ 556.465901] RBP: ffff8801f292f980 R08: ffffed003e73242d R09: ffffed003e73242d
    [ 556.467311] R10: 0000000000000001 R11: ffffed003e73242c R12: 00000000fffffc64
    [ 556.468706] R13: ffff8801f3992000 R14: 0000000000000058 R15: 00000000ffff8801
    [ 556.470117] FS: 00007f8029297840(0000) GS:ffff8801f6f00000(0000) knlGS:0000000000000000
    [ 556.471702] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 556.472838] CR2: 000055f5f57305d8 CR3: 00000001f18b0000 CR4: 00000000000006e0
    [ 556.474265] Call Trace:
    [ 556.474782] ? f2fs_alloc_nid_failed+0xf0/0xf0
    [ 556.475686] ? truncate_nodes+0x980/0x980
    [ 556.476516] ? pagecache_get_page+0x21f/0x2f0
    [ 556.477412] ? __asan_loadN+0xf/0x20
    [ 556.478153] ? __get_node_page+0x331/0x5b0
    [ 556.478992] ? reweight_entity+0x1e6/0x3b0
    [ 556.479826] f2fs_truncate_blocks+0x55e/0x740
    [ 556.480709] ? f2fs_truncate_data_blocks+0x20/0x20
    [ 556.481689] ? __radix_tree_lookup+0x34/0x160
    [ 556.482630] ? radix_tree_lookup+0xd/0x10
    [ 556.483445] f2fs_truncate+0xd4/0x1a0
    [ 556.484206] f2fs_evict_inode+0x5ce/0x630
    [ 556.485032] evict+0x16f/0x290
    [ 556.485664] iput+0x280/0x300
    [ 556.486300] dentry_unlink_inode+0x165/0x1e0
    [ 556.487169] __dentry_kill+0x16a/0x260
    [ 556.487936] dentry_kill+0x70/0x250
    [ 556.488651] shrink_dentry_list+0x125/0x260
    [ 556.489504] shrink_dcache_parent+0xc1/0x110
    [ 556.490379] ? shrink_dcache_sb+0x200/0x200
    [ 556.491231] ? bit_wait_timeout+0xc0/0xc0
    [ 556.492047] do_one_tree+0x12/0x40
    [ 556.492743] shrink_dcache_for_umount+0x3f/0xa0
    [ 556.493656] generic_shutdown_super+0x43/0x1c0
    [ 556.494561] kill_block_super+0x52/0x80
    [ 556.495341] kill_f2fs_super+0x62/0x70
    [ 556.496105] deactivate_locked_super+0x6f/0xa0
    [ 556.497004] deactivate_super+0x5e/0x80
    [ 556.497785] cleanup_mnt+0x61/0xa0
    [ 556.498492] __cleanup_mnt+0x12/0x20
    [ 556.499218] task_work_run+0xc8/0xf0
    [ 556.499949] exit_to_usermode_loop+0x125/0x130
    [ 556.500846] do_syscall_64+0x138/0x170
    [ 556.501609] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 556.502659] RIP: 0033:0x7f8028b77487
    [ 556.503384] Code: 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 31 f6 e9 09 00 00 00 66 0f 1f 84 00 00 00 00 00 b8 a6 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d e1 c9 2b 00 f7 d8 64 89 01 48
    [ 556.507137] RSP: 002b:00007fff9f2e3598 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
    [ 556.508637] RAX: 0000000000000000 RBX: 0000000000ebd030 RCX: 00007f8028b77487
    [ 556.510069] RDX: 0000000000000001 RSI: 0000000000000000 RDI: 0000000000ec41e0
    [ 556.511481] RBP: 0000000000ec41e0 R08: 0000000000000000 R09: 0000000000000014
    [ 556.512892] R10: 00000000000006b2 R11: 0000000000000246 R12: 00007f802908083c
    [ 556.514320] R13: 0000000000000000 R14: 0000000000ebd210 R15: 00007fff9f2e3820
    [ 556.515745] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 556.529276] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 556.530340] RIP: 0010:f2fs_truncate_inode_blocks+0x4a7/0x6f0
    [ 556.531513] Code: e8 ae ea ff ff 41 89 c7 c1 e8 1f 84 c0 74 0a 41 83 ff fe 0f 85 35 ff ff ff 81 85 b0 fe ff ff fb 03 00 00 e9 f7 fd ff ff 0f 0b 0b e8 62 b7 9a 00 48 8b bd a0 fe ff ff e8 56 54 ae ff 48 8b b5
    [ 556.535330] RSP: 0018:ffff8801f292f808 EFLAGS: 00010286
    [ 556.536395] RAX: ffffed003e73242d RBX: ffff8801f292f958 RCX: ffffffffb88b81bc
    [ 556.537824] RDX: 0000000000000000 RSI: 0000000000000004 RDI: ffff8801f3992164
    [ 556.539290] RBP: ffff8801f292f980 R08: ffffed003e73242d R09: ffffed003e73242d
    [ 556.540709] R10: 0000000000000001 R11: ffffed003e73242c R12: 00000000fffffc64
    [ 556.542131] R13: ffff8801f3992000 R14: 0000000000000058 R15: 00000000ffff8801
    [ 556.543579] FS: 00007f8029297840(0000) GS:ffff8801f6f00000(0000) knlGS:0000000000000000
    [ 556.545180] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 556.546338] CR2: 000055f5f57305d8 CR3: 00000001f18b0000 CR4: 00000000000006e0
    [ 556.547809] ==================================================================
    [ 556.549248] BUG: KASAN: stack-out-of-bounds in arch_tlb_gather_mmu+0x52/0x170
    [ 556.550672] Write of size 8 at addr ffff8801f292fd10 by task umount/1310

    [ 556.552338] CPU: 1 PID: 1310 Comm: umount Tainted: G D 4.18.0-rc1+ #4
    [ 556.553886] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 556.555756] Call Trace:
    [ 556.556264] dump_stack+0x7b/0xb5
    [ 556.556944] print_address_description+0x70/0x290
    [ 556.557903] kasan_report+0x291/0x390
    [ 556.558649] ? arch_tlb_gather_mmu+0x52/0x170
    [ 556.559537] __asan_store8+0x57/0x90
    [ 556.560268] arch_tlb_gather_mmu+0x52/0x170
    [ 556.561110] tlb_gather_mmu+0x12/0x40
    [ 556.561862] exit_mmap+0x123/0x2a0
    [ 556.562555] ? __ia32_sys_munmap+0x50/0x50
    [ 556.563384] ? exit_aio+0x98/0x230
    [ 556.564079] ? __x32_compat_sys_io_submit+0x260/0x260
    [ 556.565099] ? taskstats_exit+0x1f4/0x640
    [ 556.565925] ? kasan_check_read+0x11/0x20
    [ 556.566739] ? mm_update_next_owner+0x322/0x380
    [ 556.567652] mmput+0x8b/0x1d0
    [ 556.568260] do_exit+0x43a/0x1390
    [ 556.568937] ? mm_update_next_owner+0x380/0x380
    [ 556.569855] ? deactivate_super+0x5e/0x80
    [ 556.570668] ? cleanup_mnt+0x61/0xa0
    [ 556.571395] ? __cleanup_mnt+0x12/0x20
    [ 556.572156] ? task_work_run+0xc8/0xf0
    [ 556.572917] ? exit_to_usermode_loop+0x125/0x130
    [ 556.573861] rewind_stack_do_exit+0x17/0x20
    [ 556.574707] RIP: 0033:0x7f8028b77487
    [ 556.575428] Code: Bad RIP value.
    [ 556.576106] RSP: 002b:00007fff9f2e3598 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
    [ 556.577599] RAX: 0000000000000000 RBX: 0000000000ebd030 RCX: 00007f8028b77487
    [ 556.579020] RDX: 0000000000000001 RSI: 0000000000000000 RDI: 0000000000ec41e0
    [ 556.580422] RBP: 0000000000ec41e0 R08: 0000000000000000 R09: 0000000000000014
    [ 556.581833] R10: 00000000000006b2 R11: 0000000000000246 R12: 00007f802908083c
    [ 556.583252] R13: 0000000000000000 R14: 0000000000ebd210 R15: 00007fff9f2e3820

    [ 556.584983] The buggy address belongs to the page:
    [ 556.585961] page:ffffea0007ca4bc0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
    [ 556.587540] flags: 0x2ffff0000000000()
    [ 556.588296] raw: 02ffff0000000000 0000000000000000 dead000000000200 0000000000000000
    [ 556.589822] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
    [ 556.591359] page dumped because: kasan: bad access detected

    [ 556.592786] Memory state around the buggy address:
    [ 556.593753] ffff8801f292fc00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [ 556.595191] ffff8801f292fc80: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 00 00 00 00
    [ 556.596613] >ffff8801f292fd00: 00 00 f3 00 00 00 00 f3 f3 00 00 00 00 f4 f4 f4
    [ 556.598044] ^
    [ 556.598797] ffff8801f292fd80: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
    [ 556.600225] ffff8801f292fe00: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 00 f4 f4 f4
    [ 556.601647] ==================================================================

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc1/source/fs/f2fs/node.c#L987
    case NODE_DIND_BLOCK:
    err = truncate_nodes(&dn, nofs, offset[1], 3);
    cont = 0;
    break;

    default:
    BUG();
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit 9dc956b2c8523aed39d1e6508438be9fea28c8fc upstream.

    This patch fixs to do sanity check with user_block_count.

    - Overview
    Divide zero in utilization when mount() a corrupted f2fs image

    - Reproduce (4.18 upstream kernel)

    - Kernel message
    [ 564.099503] F2FS-fs (loop0): invalid crc value
    [ 564.101991] divide error: 0000 [#1] SMP KASAN PTI
    [ 564.103103] CPU: 1 PID: 1298 Comm: f2fs_discard-7: Not tainted 4.18.0-rc1+ #4
    [ 564.104584] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 564.106624] RIP: 0010:issue_discard_thread+0x248/0x5c0
    [ 564.107692] Code: ff ff 48 8b bd e8 fe ff ff 41 8b 9d 4c 04 00 00 e8 cd b8 ad ff 41 8b 85 50 04 00 00 31 d2 48 8d 04 80 48 8d 04 80 48 c1 e0 02 f7 f3 83 f8 50 7e 16 41 c7 86 7c ff ff ff 01 00 00 00 41 c7 86
    [ 564.111686] RSP: 0018:ffff8801f3117dc0 EFLAGS: 00010206
    [ 564.112775] RAX: 0000000000000384 RBX: 0000000000000000 RCX: ffffffffb88c1e03
    [ 564.114250] RDX: 0000000000000000 RSI: dffffc0000000000 RDI: ffff8801e3aa4850
    [ 564.115706] RBP: ffff8801f3117f00 R08: 1ffffffff751a1d0 R09: fffffbfff751a1d0
    [ 564.117177] R10: 0000000000000001 R11: fffffbfff751a1d0 R12: 00000000fffffffc
    [ 564.118634] R13: ffff8801e3aa4400 R14: ffff8801f3117ed8 R15: ffff8801e2050000
    [ 564.120094] FS: 0000000000000000(0000) GS:ffff8801f6f00000(0000) knlGS:0000000000000000
    [ 564.121748] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 564.122923] CR2: 000000000202b078 CR3: 00000001f11ac000 CR4: 00000000000006e0
    [ 564.124383] Call Trace:
    [ 564.124924] ? __issue_discard_cmd+0x480/0x480
    [ 564.125882] ? __sched_text_start+0x8/0x8
    [ 564.126756] ? __kthread_parkme+0xcb/0x100
    [ 564.127620] ? kthread_blkcg+0x70/0x70
    [ 564.128412] kthread+0x180/0x1d0
    [ 564.129105] ? __issue_discard_cmd+0x480/0x480
    [ 564.130029] ? kthread_associate_blkcg+0x150/0x150
    [ 564.131033] ret_from_fork+0x35/0x40
    [ 564.131794] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 564.141798] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 564.142773] RIP: 0010:issue_discard_thread+0x248/0x5c0
    [ 564.143885] Code: ff ff 48 8b bd e8 fe ff ff 41 8b 9d 4c 04 00 00 e8 cd b8 ad ff 41 8b 85 50 04 00 00 31 d2 48 8d 04 80 48 8d 04 80 48 c1 e0 02 f7 f3 83 f8 50 7e 16 41 c7 86 7c ff ff ff 01 00 00 00 41 c7 86
    [ 564.147776] RSP: 0018:ffff8801f3117dc0 EFLAGS: 00010206
    [ 564.148856] RAX: 0000000000000384 RBX: 0000000000000000 RCX: ffffffffb88c1e03
    [ 564.150424] RDX: 0000000000000000 RSI: dffffc0000000000 RDI: ffff8801e3aa4850
    [ 564.151906] RBP: ffff8801f3117f00 R08: 1ffffffff751a1d0 R09: fffffbfff751a1d0
    [ 564.153463] R10: 0000000000000001 R11: fffffbfff751a1d0 R12: 00000000fffffffc
    [ 564.154915] R13: ffff8801e3aa4400 R14: ffff8801f3117ed8 R15: ffff8801e2050000
    [ 564.156405] FS: 0000000000000000(0000) GS:ffff8801f6f00000(0000) knlGS:0000000000000000
    [ 564.158070] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 564.159279] CR2: 000000000202b078 CR3: 00000001f11ac000 CR4: 00000000000006e0
    [ 564.161043] ==================================================================
    [ 564.162587] BUG: KASAN: stack-out-of-bounds in from_kuid_munged+0x1d/0x50
    [ 564.163994] Read of size 4 at addr ffff8801f3117c84 by task f2fs_discard-7:/1298

    [ 564.165852] CPU: 1 PID: 1298 Comm: f2fs_discard-7: Tainted: G D 4.18.0-rc1+ #4
    [ 564.167593] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 564.169522] Call Trace:
    [ 564.170057] dump_stack+0x7b/0xb5
    [ 564.170778] print_address_description+0x70/0x290
    [ 564.171765] kasan_report+0x291/0x390
    [ 564.172540] ? from_kuid_munged+0x1d/0x50
    [ 564.173408] __asan_load4+0x78/0x80
    [ 564.174148] from_kuid_munged+0x1d/0x50
    [ 564.174962] do_notify_parent+0x1f5/0x4f0
    [ 564.175808] ? send_sigqueue+0x390/0x390
    [ 564.176639] ? css_set_move_task+0x152/0x340
    [ 564.184197] do_exit+0x1290/0x1390
    [ 564.184950] ? __issue_discard_cmd+0x480/0x480
    [ 564.185884] ? mm_update_next_owner+0x380/0x380
    [ 564.186829] ? __sched_text_start+0x8/0x8
    [ 564.187672] ? __kthread_parkme+0xcb/0x100
    [ 564.188528] ? kthread_blkcg+0x70/0x70
    [ 564.189333] ? kthread+0x180/0x1d0
    [ 564.190052] ? __issue_discard_cmd+0x480/0x480
    [ 564.190983] rewind_stack_do_exit+0x17/0x20

    [ 564.192190] The buggy address belongs to the page:
    [ 564.193213] page:ffffea0007cc45c0 count:0 mapcount:0 mapping:0000000000000000 index:0x0
    [ 564.194856] flags: 0x2ffff0000000000()
    [ 564.195644] raw: 02ffff0000000000 0000000000000000 dead000000000200 0000000000000000
    [ 564.197247] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
    [ 564.198826] page dumped because: kasan: bad access detected

    [ 564.200299] Memory state around the buggy address:
    [ 564.201306] ffff8801f3117b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [ 564.202779] ffff8801f3117c00: 00 00 00 00 00 00 00 00 00 00 00 f3 f3 f3 f3 f3
    [ 564.204252] >ffff8801f3117c80: f3 f3 f3 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
    [ 564.205742] ^
    [ 564.206424] ffff8801f3117d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    [ 564.207908] ffff8801f3117d80: f3 f3 f3 f3 f3 f3 f3 f3 00 00 00 00 00 00 00 00
    [ 564.209389] ==================================================================
    [ 564.231795] F2FS-fs (loop0): Mounted with checkpoint version = 2

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc1/source/fs/f2fs/segment.h#L586
    return div_u64((u64)valid_user_blocks(sbi) * 100,
    sbi->user_block_count);
    Missing checks on sbi->user_block_count.

    Reported-by: Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit 76d56d4ab4f2a9e4f085c7d77172194ddaccf7d2 upstream.

    If FI_EXTRA_ATTR is set in inode by fuzzing, inode.i_addr[0] will be
    parsed as inode.i_extra_isize, then in __recover_inline_status, inline
    data address will beyond boundary of page, result in accessing invalid
    memory.

    So in this condition, during reading inode page, let's do sanity check
    with EXTRA_ATTR feature of fs and extra_attr bit of inode, if they're
    inconsistent, deny to load this inode.

    - Overview
    Out-of-bound access in f2fs_iget() when mounting a corrupted f2fs image

    - Reproduce

    The following message will be got in KASAN build of 4.18 upstream kernel.
    [ 819.392227] ==================================================================
    [ 819.393901] BUG: KASAN: slab-out-of-bounds in f2fs_iget+0x736/0x1530
    [ 819.395329] Read of size 4 at addr ffff8801f099c968 by task mount/1292

    [ 819.397079] CPU: 1 PID: 1292 Comm: mount Not tainted 4.18.0-rc1+ #4
    [ 819.397082] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 819.397088] Call Trace:
    [ 819.397124] dump_stack+0x7b/0xb5
    [ 819.397154] print_address_description+0x70/0x290
    [ 819.397159] kasan_report+0x291/0x390
    [ 819.397163] ? f2fs_iget+0x736/0x1530
    [ 819.397176] check_memory_region+0x139/0x190
    [ 819.397182] __asan_loadN+0xf/0x20
    [ 819.397185] f2fs_iget+0x736/0x1530
    [ 819.397197] f2fs_fill_super+0x1b4f/0x2b40
    [ 819.397202] ? f2fs_fill_super+0x1b4f/0x2b40
    [ 819.397208] ? f2fs_commit_super+0x1b0/0x1b0
    [ 819.397227] ? set_blocksize+0x90/0x140
    [ 819.397241] mount_bdev+0x1c5/0x210
    [ 819.397245] ? f2fs_commit_super+0x1b0/0x1b0
    [ 819.397252] f2fs_mount+0x15/0x20
    [ 819.397256] mount_fs+0x60/0x1a0
    [ 819.397267] ? alloc_vfsmnt+0x309/0x360
    [ 819.397272] vfs_kern_mount+0x6b/0x1a0
    [ 819.397282] do_mount+0x34a/0x18c0
    [ 819.397300] ? lockref_put_or_lock+0xcf/0x160
    [ 819.397306] ? copy_mount_string+0x20/0x20
    [ 819.397318] ? memcg_kmem_put_cache+0x1b/0xa0
    [ 819.397324] ? kasan_check_write+0x14/0x20
    [ 819.397334] ? _copy_from_user+0x6a/0x90
    [ 819.397353] ? memdup_user+0x42/0x60
    [ 819.397359] ksys_mount+0x83/0xd0
    [ 819.397365] __x64_sys_mount+0x67/0x80
    [ 819.397388] do_syscall_64+0x78/0x170
    [ 819.397403] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 819.397422] RIP: 0033:0x7f54c667cb9a
    [ 819.397424] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 819.397483] RSP: 002b:00007ffd8f46cd08 EFLAGS: 00000202 ORIG_RAX: 00000000000000a5
    [ 819.397496] RAX: ffffffffffffffda RBX: 0000000000dfa030 RCX: 00007f54c667cb9a
    [ 819.397498] RDX: 0000000000dfa210 RSI: 0000000000dfbf30 RDI: 0000000000e02ec0
    [ 819.397501] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 819.397503] R10: 00000000c0ed0000 R11: 0000000000000202 R12: 0000000000e02ec0
    [ 819.397505] R13: 0000000000dfa210 R14: 0000000000000000 R15: 0000000000000003

    [ 819.397866] Allocated by task 139:
    [ 819.398702] save_stack+0x46/0xd0
    [ 819.398705] kasan_kmalloc+0xad/0xe0
    [ 819.398709] kasan_slab_alloc+0x11/0x20
    [ 819.398713] kmem_cache_alloc+0xd1/0x1e0
    [ 819.398717] dup_fd+0x50/0x4c0
    [ 819.398740] copy_process.part.37+0xbed/0x32e0
    [ 819.398744] _do_fork+0x16e/0x590
    [ 819.398748] __x64_sys_clone+0x69/0x80
    [ 819.398752] do_syscall_64+0x78/0x170
    [ 819.398756] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 819.399097] Freed by task 159:
    [ 819.399743] save_stack+0x46/0xd0
    [ 819.399747] __kasan_slab_free+0x13c/0x1a0
    [ 819.399750] kasan_slab_free+0xe/0x10
    [ 819.399754] kmem_cache_free+0x89/0x1e0
    [ 819.399757] put_files_struct+0x132/0x150
    [ 819.399761] exit_files+0x62/0x70
    [ 819.399766] do_exit+0x47b/0x1390
    [ 819.399770] do_group_exit+0x86/0x130
    [ 819.399774] __x64_sys_exit_group+0x2c/0x30
    [ 819.399778] do_syscall_64+0x78/0x170
    [ 819.399782] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 819.400115] The buggy address belongs to the object at ffff8801f099c680
    which belongs to the cache files_cache of size 704
    [ 819.403234] The buggy address is located 40 bytes to the right of
    704-byte region [ffff8801f099c680, ffff8801f099c940)
    [ 819.405689] The buggy address belongs to the page:
    [ 819.406709] page:ffffea0007c26700 count:1 mapcount:0 mapping:ffff8801f69a3340 index:0xffff8801f099d380 compound_mapcount: 0
    [ 819.408984] flags: 0x2ffff0000008100(slab|head)
    [ 819.409932] raw: 02ffff0000008100 ffffea00077fb600 0000000200000002 ffff8801f69a3340
    [ 819.411514] raw: ffff8801f099d380 0000000080130000 00000001ffffffff 0000000000000000
    [ 819.413073] page dumped because: kasan: bad access detected

    [ 819.414539] Memory state around the buggy address:
    [ 819.415521] ffff8801f099c800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 819.416981] ffff8801f099c880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 819.418454] >ffff8801f099c900: fb fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
    [ 819.419921] ^
    [ 819.421265] ffff8801f099c980: fc fc fc fc fc fc fc fc fb fb fb fb fb fb fb fb
    [ 819.422745] ffff8801f099ca00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 819.424206] ==================================================================
    [ 819.425668] Disabling lock debugging due to kernel taint
    [ 819.457463] F2FS-fs (loop0): Mounted with checkpoint version = 3

    The kernel still mounts the image. If you run the following program on the mounted folder mnt,

    (poc.c)

    static void activity(char *mpoint) {

    char *foo_bar_baz;
    int err;

    static int buf[8192];
    memset(buf, 0, sizeof(buf));

    err = asprintf(&foo_bar_baz, "%s/foo/bar/baz", mpoint);
    int fd = open(foo_bar_baz, O_RDONLY, 0);
    if (fd >= 0) {
    read(fd, (char *)buf, 11);
    close(fd);
    }
    }

    int main(int argc, char *argv[]) {
    activity(argv[1]);
    return 0;
    }

    You can get kernel crash:
    [ 819.457463] F2FS-fs (loop0): Mounted with checkpoint version = 3
    [ 918.028501] BUG: unable to handle kernel paging request at ffffed0048000d82
    [ 918.044020] PGD 23ffee067 P4D 23ffee067 PUD 23fbef067 PMD 0
    [ 918.045207] Oops: 0000 [#1] SMP KASAN PTI
    [ 918.046048] CPU: 0 PID: 1309 Comm: poc Tainted: G B 4.18.0-rc1+ #4
    [ 918.047573] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 918.049552] RIP: 0010:check_memory_region+0x5e/0x190
    [ 918.050565] Code: f8 49 c1 e8 03 49 89 db 49 c1 eb 03 4d 01 cb 4d 01 c1 4d 8d 63 01 4c 89 c8 4d 89 e2 4d 29 ca 49 83 fa 10 7f 3d 4d 85 d2 74 32 80 39 00 75 23 48 b8 01 00 00 00 00 fc ff df 4d 01 d1 49 01 c0
    [ 918.054322] RSP: 0018:ffff8801e3a1f258 EFLAGS: 00010202
    [ 918.055400] RAX: ffffed0048000d82 RBX: ffff880240006c11 RCX: ffffffffb8867d14
    [ 918.056832] RDX: 0000000000000000 RSI: 0000000000000002 RDI: ffff880240006c10
    [ 918.058253] RBP: ffff8801e3a1f268 R08: 1ffff10048000d82 R09: ffffed0048000d82
    [ 918.059717] R10: 0000000000000001 R11: ffffed0048000d82 R12: ffffed0048000d83
    [ 918.061159] R13: ffff8801e3a1f390 R14: 0000000000000000 R15: ffff880240006c08
    [ 918.062614] FS: 00007fac9732c700(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 918.064246] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 918.065412] CR2: ffffed0048000d82 CR3: 00000001df77a000 CR4: 00000000000006f0
    [ 918.066882] Call Trace:
    [ 918.067410] __asan_loadN+0xf/0x20
    [ 918.068149] f2fs_find_target_dentry+0xf4/0x270
    [ 918.069083] ? __get_node_page+0x331/0x5b0
    [ 918.069925] f2fs_find_in_inline_dir+0x24b/0x310
    [ 918.070881] ? f2fs_recover_inline_data+0x4c0/0x4c0
    [ 918.071905] ? unwind_next_frame.part.5+0x34f/0x490
    [ 918.072901] ? unwind_dump+0x290/0x290
    [ 918.073695] ? is_bpf_text_address+0xe/0x20
    [ 918.074566] __f2fs_find_entry+0x599/0x670
    [ 918.075408] ? kasan_unpoison_shadow+0x36/0x50
    [ 918.076315] ? kasan_kmalloc+0xad/0xe0
    [ 918.077100] ? memcg_kmem_put_cache+0x55/0xa0
    [ 918.077998] ? f2fs_find_target_dentry+0x270/0x270
    [ 918.079006] ? d_set_d_op+0x30/0x100
    [ 918.079749] ? __d_lookup_rcu+0x69/0x2e0
    [ 918.080556] ? __d_alloc+0x275/0x450
    [ 918.081297] ? kasan_check_write+0x14/0x20
    [ 918.082135] ? memset+0x31/0x40
    [ 918.082820] ? fscrypt_setup_filename+0x1ec/0x4c0
    [ 918.083782] ? d_alloc_parallel+0x5bb/0x8c0
    [ 918.084640] f2fs_find_entry+0xe9/0x110
    [ 918.085432] ? __f2fs_find_entry+0x670/0x670
    [ 918.086308] ? kasan_check_write+0x14/0x20
    [ 918.087163] f2fs_lookup+0x297/0x590
    [ 918.087902] ? f2fs_link+0x2b0/0x2b0
    [ 918.088646] ? legitimize_path.isra.29+0x61/0xa0
    [ 918.089589] __lookup_slow+0x12e/0x240
    [ 918.090371] ? may_delete+0x2b0/0x2b0
    [ 918.091123] ? __nd_alloc_stack+0xa0/0xa0
    [ 918.091944] lookup_slow+0x44/0x60
    [ 918.092642] walk_component+0x3ee/0xa40
    [ 918.093428] ? is_bpf_text_address+0xe/0x20
    [ 918.094283] ? pick_link+0x3e0/0x3e0
    [ 918.095047] ? in_group_p+0xa5/0xe0
    [ 918.095771] ? generic_permission+0x53/0x1e0
    [ 918.096666] ? security_inode_permission+0x1d/0x70
    [ 918.097646] ? inode_permission+0x7a/0x1f0
    [ 918.098497] link_path_walk+0x2a2/0x7b0
    [ 918.099298] ? apparmor_capget+0x3d0/0x3d0
    [ 918.100140] ? walk_component+0xa40/0xa40
    [ 918.100958] ? path_init+0x2e6/0x580
    [ 918.101695] path_openat+0x1bb/0x2160
    [ 918.102471] ? __save_stack_trace+0x92/0x100
    [ 918.103352] ? save_stack+0xb5/0xd0
    [ 918.104070] ? vfs_unlink+0x250/0x250
    [ 918.104822] ? save_stack+0x46/0xd0
    [ 918.105538] ? kasan_slab_alloc+0x11/0x20
    [ 918.106370] ? kmem_cache_alloc+0xd1/0x1e0
    [ 918.107213] ? getname_flags+0x76/0x2c0
    [ 918.107997] ? getname+0x12/0x20
    [ 918.108677] ? do_sys_open+0x14b/0x2c0
    [ 918.109450] ? __x64_sys_open+0x4c/0x60
    [ 918.110255] ? do_syscall_64+0x78/0x170
    [ 918.111083] ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 918.112148] ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 918.113204] ? f2fs_empty_inline_dir+0x1e0/0x1e0
    [ 918.114150] ? timespec64_trunc+0x5c/0x90
    [ 918.114993] ? wb_io_lists_depopulated+0x1a/0xc0
    [ 918.115937] ? inode_io_list_move_locked+0x102/0x110
    [ 918.116949] do_filp_open+0x12b/0x1d0
    [ 918.117709] ? may_open_dev+0x50/0x50
    [ 918.118475] ? kasan_kmalloc+0xad/0xe0
    [ 918.119246] do_sys_open+0x17c/0x2c0
    [ 918.119983] ? do_sys_open+0x17c/0x2c0
    [ 918.120751] ? filp_open+0x60/0x60
    [ 918.121463] ? task_work_run+0x4d/0xf0
    [ 918.122237] __x64_sys_open+0x4c/0x60
    [ 918.123001] do_syscall_64+0x78/0x170
    [ 918.123759] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 918.124802] RIP: 0033:0x7fac96e3e040
    [ 918.125537] Code: 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 83 3d 09 27 2d 00 00 75 10 b8 02 00 00 00 0f 05 3d 01 f0 ff ff 73 31 c3 48 83 ec 08 e8 7e e0 01 00 48 89 04 24
    [ 918.129341] RSP: 002b:00007fff1b37f848 EFLAGS: 00000246 ORIG_RAX: 0000000000000002
    [ 918.130870] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fac96e3e040
    [ 918.132295] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 000000000122d080
    [ 918.133748] RBP: 00007fff1b37f9b0 R08: 00007fac9710bbd8 R09: 0000000000000001
    [ 918.135209] R10: 000000000000069d R11: 0000000000000246 R12: 0000000000400c20
    [ 918.136650] R13: 00007fff1b37fab0 R14: 0000000000000000 R15: 0000000000000000
    [ 918.138093] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 918.147924] CR2: ffffed0048000d82
    [ 918.148619] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 918.149563] RIP: 0010:check_memory_region+0x5e/0x190
    [ 918.150576] Code: f8 49 c1 e8 03 49 89 db 49 c1 eb 03 4d 01 cb 4d 01 c1 4d 8d 63 01 4c 89 c8 4d 89 e2 4d 29 ca 49 83 fa 10 7f 3d 4d 85 d2 74 32 80 39 00 75 23 48 b8 01 00 00 00 00 fc ff df 4d 01 d1 49 01 c0
    [ 918.154360] RSP: 0018:ffff8801e3a1f258 EFLAGS: 00010202
    [ 918.155411] RAX: ffffed0048000d82 RBX: ffff880240006c11 RCX: ffffffffb8867d14
    [ 918.156833] RDX: 0000000000000000 RSI: 0000000000000002 RDI: ffff880240006c10
    [ 918.158257] RBP: ffff8801e3a1f268 R08: 1ffff10048000d82 R09: ffffed0048000d82
    [ 918.159722] R10: 0000000000000001 R11: ffffed0048000d82 R12: ffffed0048000d83
    [ 918.161149] R13: ffff8801e3a1f390 R14: 0000000000000000 R15: ffff880240006c08
    [ 918.162587] FS: 00007fac9732c700(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 918.164203] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 918.165356] CR2: ffffed0048000d82 CR3: 00000001df77a000 CR4: 00000000000006f0

    Reported-by: Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14: adjust context]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • This was done as part of commit 5d64600d4f33 "f2fs: avoid bug_on on
    corrupted inode" upstream, but the specific check that commit added is
    not applicable to 4.14.

    Cc: Jaegeuk Kim
    Cc: Chao Yu
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Ben Hutchings
     
  • commit 42bf546c1fe3f3654bdf914e977acbc2b80a5be5 upstream.

    As Wen Xu reported in below link:

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

    - Overview
    Divide zero in reset_curseg() when mounting a crafted f2fs image

    - Reproduce

    - Kernel message
    [ 588.281510] divide error: 0000 [#1] SMP KASAN PTI
    [ 588.282701] CPU: 0 PID: 1293 Comm: mount Not tainted 4.18.0-rc1+ #4
    [ 588.284000] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 588.286178] RIP: 0010:reset_curseg+0x94/0x1a0
    [ 588.298166] RSP: 0018:ffff8801e88d7940 EFLAGS: 00010246
    [ 588.299360] RAX: 0000000000000014 RBX: ffff8801e1d46d00 RCX: ffffffffb88bf60b
    [ 588.300809] RDX: 0000000000000000 RSI: dffffc0000000000 RDI: ffff8801e1d46d64
    [ 588.305272] R13: 0000000000000000 R14: 0000000000000014 R15: 0000000000000000
    [ 588.306822] FS: 00007fad85008840(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 588.308456] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 588.309623] CR2: 0000000001705078 CR3: 00000001f30f8000 CR4: 00000000000006f0
    [ 588.311085] Call Trace:
    [ 588.311637] f2fs_build_segment_manager+0x103f/0x3410
    [ 588.316136] ? f2fs_commit_super+0x1b0/0x1b0
    [ 588.317031] ? set_blocksize+0x90/0x140
    [ 588.319473] f2fs_mount+0x15/0x20
    [ 588.320166] mount_fs+0x60/0x1a0
    [ 588.320847] ? alloc_vfsmnt+0x309/0x360
    [ 588.321647] vfs_kern_mount+0x6b/0x1a0
    [ 588.322432] do_mount+0x34a/0x18c0
    [ 588.323175] ? strndup_user+0x46/0x70
    [ 588.323937] ? copy_mount_string+0x20/0x20
    [ 588.324793] ? memcg_kmem_put_cache+0x1b/0xa0
    [ 588.325702] ? kasan_check_write+0x14/0x20
    [ 588.326562] ? _copy_from_user+0x6a/0x90
    [ 588.327375] ? memdup_user+0x42/0x60
    [ 588.328118] ksys_mount+0x83/0xd0
    [ 588.328808] __x64_sys_mount+0x67/0x80
    [ 588.329607] do_syscall_64+0x78/0x170
    [ 588.330400] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 588.331461] RIP: 0033:0x7fad848e8b9a
    [ 588.336022] RSP: 002b:00007ffd7c5b6be8 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 588.337547] RAX: ffffffffffffffda RBX: 00000000016f8030 RCX: 00007fad848e8b9a
    [ 588.338999] RDX: 00000000016f8210 RSI: 00000000016f9f30 RDI: 0000000001700ec0
    [ 588.340442] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 588.341887] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 0000000001700ec0
    [ 588.343341] R13: 00000000016f8210 R14: 0000000000000000 R15: 0000000000000003
    [ 588.354891] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 588.355862] RIP: 0010:reset_curseg+0x94/0x1a0
    [ 588.360742] RSP: 0018:ffff8801e88d7940 EFLAGS: 00010246
    [ 588.361812] RAX: 0000000000000014 RBX: ffff8801e1d46d00 RCX: ffffffffb88bf60b
    [ 588.363485] RDX: 0000000000000000 RSI: dffffc0000000000 RDI: ffff8801e1d46d64
    [ 588.365213] RBP: ffff8801e88d7968 R08: ffffed003c32266f R09: ffffed003c32266f
    [ 588.366661] R10: 0000000000000001 R11: ffffed003c32266e R12: ffff8801f0337700
    [ 588.368110] R13: 0000000000000000 R14: 0000000000000014 R15: 0000000000000000
    [ 588.370057] FS: 00007fad85008840(0000) GS:ffff8801f6e00000(0000) knlGS:0000000000000000
    [ 588.372099] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 588.373291] CR2: 0000000001705078 CR3: 00000001f30f8000 CR4: 00000000000006f0

    - Location
    https://elixir.bootlin.com/linux/latest/source/fs/f2fs/segment.c#L2147
    curseg->zone = GET_ZONE_FROM_SEG(sbi, curseg->segno);

    If secs_per_zone is corrupted due to fuzzing test, it will cause divide
    zero operation when using GET_ZONE_FROM_SEG macro, so we should do more
    sanity check with secs_per_zone during mount to avoid this issue.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit e1da7872f6eda977bd812346bf588c35e4495a1e upstream.

    This patch introduces verify_blkaddr to check meta/data block address
    with valid range to detect bug earlier.

    In addition, once we encounter an invalid blkaddr, notice user to run
    fsck to fix, and let the kernel panic.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14: I skipped an earlier renaming of
    is_valid_meta_blkaddr() to f2fs_is_valid_meta_blkaddr()]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit 7b525dd01365c6764018e374d391c92466be1b7a upstream.

    - rename is_valid_blkaddr() to is_valid_meta_blkaddr() for readability.
    - introduce is_valid_blkaddr() for cleanup.

    No logic change in this patch.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Chao Yu
     
  • commit 0cfe75c5b011994651a4ca6d74f20aa997bfc69a upstream.

    In order to avoid the below overflow issue, we should have checked the
    boundaries in superblock before reaching out to allocation. As Linus suggested,
    the right place should be sanity_check_raw_super().

    Dr Silvio Cesare of InfoSect reported:

    There are integer overflows with using the cp_payload superblock field in the
    f2fs filesystem potentially leading to memory corruption.

    include/linux/f2fs_fs.h

    struct f2fs_super_block {
    ...
    __le32 cp_payload;

    fs/f2fs/f2fs.h

    typedef u32 block_t; /*
    * should not change u32, since it is the on-disk block
    * address format, __le32.
    */
    ...

    static inline block_t __cp_payload(struct f2fs_sb_info *sbi)
    {
    return le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
    }

    fs/f2fs/checkpoint.c

    block_t start_blk, orphan_blocks, i, j;
    ...
    start_blk = __start_cp_addr(sbi) + 1 + __cp_payload(sbi);
    orphan_blocks = __start_sum_addr(sbi) - 1 - __cp_payload(sbi);

    +++ integer overflows

    ...
    unsigned int cp_blks = 1 + __cp_payload(sbi);
    ...
    sbi->ckpt = kzalloc(cp_blks * blk_size, GFP_KERNEL);

    +++ integer overflow leading to incorrect heap allocation.

    int cp_payload_blks = __cp_payload(sbi);
    ...
    ckpt->cp_pack_start_sum = cpu_to_le32(1 + cp_payload_blks +
    orphan_blocks);

    +++ sign bug and integer overflow

    ...
    for (i = 1; i < 1 + cp_payload_blks; i++)

    +++ integer overflow

    ...

    sbi->max_orphans = (sbi->blocks_per_seg - F2FS_CP_PACKS -
    NR_CURSEG_TYPE - __cp_payload(sbi)) *
    F2FS_ORPHANS_PER_BLOCK;

    +++ integer overflow

    Reported-by: Greg KH
    Reported-by: Silvio Cesare
    Suggested-by: Linus Torvalds
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    [bwh: Backported to 4.14: No hot file extension support]
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Jaegeuk Kim
     
  • commit b2ca374f33bd33fd822eb871876e4888cf79dc97 upstream.

    syzbot hit the following crash on upstream commit
    87ef12027b9b1dd0e0b12cf311fbcb19f9d92539 (Wed Apr 18 19:48:17 2018 +0000)
    Merge tag 'ceph-for-4.17-rc2' of git://github.com/ceph/ceph-client
    syzbot dashboard link: https://syzkaller.appspot.com/bug?extid=83699adeb2d13579c31e

    C reproducer: https://syzkaller.appspot.com/x/repro.c?id=5805208181407744
    syzkaller reproducer: https://syzkaller.appspot.com/x/repro.syz?id=6005073343676416
    Raw console output: https://syzkaller.appspot.com/x/log.txt?id=6555047731134464
    Kernel config: https://syzkaller.appspot.com/x/.config?id=1808800213120130118
    compiler: gcc (GCC) 8.0.1 20180413 (experimental)

    IMPORTANT: if you fix the bug, please add the following tag to the commit:
    Reported-by: syzbot+83699adeb2d13579c31e@syzkaller.appspotmail.com
    It will help syzbot understand when the bug is fixed. See footer for details.
    If you forward the report, please keep this part and the footer.

    F2FS-fs (loop0): Magic Mismatch, valid(0xf2f52010) - read(0x0)
    F2FS-fs (loop0): Can't find valid F2FS filesystem in 1th superblock
    F2FS-fs (loop0): invalid crc value
    BUG: unable to handle kernel paging request at ffffed006b2a50c0
    PGD 21ffee067 P4D 21ffee067 PUD 21fbeb067 PMD 0
    Oops: 0000 [#1] SMP KASAN
    Dumping ftrace buffer:
    (ftrace buffer empty)
    Modules linked in:
    CPU: 0 PID: 4514 Comm: syzkaller989480 Not tainted 4.17.0-rc1+ #8
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:build_sit_entries fs/f2fs/segment.c:3653 [inline]
    RIP: 0010:build_segment_manager+0x7ef7/0xbf70 fs/f2fs/segment.c:3852
    RSP: 0018:ffff8801b102e5b0 EFLAGS: 00010a06
    RAX: 1ffff1006b2a50c0 RBX: 0000000000000004 RCX: 0000000000000001
    RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8801ac74243e
    RBP: ffff8801b102f410 R08: ffff8801acbd46c0 R09: fffffbfff14d9af8
    R10: fffffbfff14d9af8 R11: ffff8801acbd46c0 R12: ffff8801ac742a80
    R13: ffff8801d9519100 R14: dffffc0000000000 R15: ffff880359528600
    FS: 0000000001e04880(0000) GS:ffff8801dae00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: ffffed006b2a50c0 CR3: 00000001ac6ac000 CR4: 00000000001406f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    f2fs_fill_super+0x4095/0x7bf0 fs/f2fs/super.c:2803
    mount_bdev+0x30c/0x3e0 fs/super.c:1165
    f2fs_mount+0x34/0x40 fs/f2fs/super.c:3020
    mount_fs+0xae/0x328 fs/super.c:1268
    vfs_kern_mount.part.34+0xd4/0x4d0 fs/namespace.c:1037
    vfs_kern_mount fs/namespace.c:1027 [inline]
    do_new_mount fs/namespace.c:2517 [inline]
    do_mount+0x564/0x3070 fs/namespace.c:2847
    ksys_mount+0x12d/0x140 fs/namespace.c:3063
    __do_sys_mount fs/namespace.c:3077 [inline]
    __se_sys_mount fs/namespace.c:3074 [inline]
    __x64_sys_mount+0xbe/0x150 fs/namespace.c:3074
    do_syscall_64+0x1b1/0x800 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x443d6a
    RSP: 002b:00007ffd312813c8 EFLAGS: 00000297 ORIG_RAX: 00000000000000a5
    RAX: ffffffffffffffda RBX: 0000000020000c00 RCX: 0000000000443d6a
    RDX: 0000000020000000 RSI: 0000000020000100 RDI: 00007ffd312813d0
    RBP: 0000000000000003 R08: 0000000020016a00 R09: 000000000000000a
    R10: 0000000000000000 R11: 0000000000000297 R12: 0000000000000004
    R13: 0000000000402c60 R14: 0000000000000000 R15: 0000000000000000
    RIP: build_sit_entries fs/f2fs/segment.c:3653 [inline] RSP: ffff8801b102e5b0
    RIP: build_segment_manager+0x7ef7/0xbf70 fs/f2fs/segment.c:3852 RSP: ffff8801b102e5b0
    CR2: ffffed006b2a50c0
    ---[ end trace a2034989e196ff17 ]---

    Reported-and-tested-by: syzbot+83699adeb2d13579c31e@syzkaller.appspotmail.com
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Ben Hutchings

    Signed-off-by: Sasha Levin

    Jaegeuk Kim
     
  • commit 0833721ec3658a4e9d5e58b6fa82cf9edc431e59 upstream.

    This patch check blkaddr more accuratly before issue a
    write or read bio.

    Signed-off-by: Yunlei He
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Ben Hutchings
    Signed-off-by: Sasha Levin

    Yunlei He
     

14 Nov, 2018

4 commits

  • commit 4c58ed076875f36dae0f240da1e25e99e5d4afb8 upstream.

    Below race can cause reversed reference on dirty count, fix it by
    relocating __submit_bio() and inc_page_count().

    Thread A Thread B
    - f2fs_inplace_write_data
    - f2fs_submit_page_bio
    - __submit_bio
    - f2fs_write_end_io
    - dec_page_count
    - inc_page_count

    Cc:
    Fixes: d1b3e72d5490 ("f2fs: submit bio of in-place-update pages")
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • commit 164a63fa6b384e30ceb96ed80bc7dc3379bc0960 upstream.

    This reverts commit 66110abc4c931f879d70e83e1281f891699364bf.

    If we clear the cold data flag out of the writeback flow, we can miscount
    -1 by end_io, which incurs a deadlock caused by all I/Os being blocked during
    heavy GC.

    Balancing F2FS Async:
    - IO (CP: 1, Data: -1, Flush: ( 0 0 1), Discard: ( ...

    GC thread: IRQ
    - move_data_page()
    - set_page_dirty()
    - clear_cold_data()
    - f2fs_write_end_io()
    - type = WB_DATA_TYPE(page);
    here, we get wrong type
    - dec_page_count(sbi, type);
    - f2fs_wait_on_page_writeback()

    Cc:
    Reported-and-Tested-by: Park Ju Hyung
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     
  • [ Upstream commit cda9cc595f0bb6ffa51a4efc4b6533dfa4039b4c ]

    Now, we depend on fsck to ensure quota file data is ok,
    so we scan whole partition if checkpoint without umount
    flag. It's same for quota off error case, which may make
    quota file data inconsistent.

    generic/019 reports below error:

    __quota_error: 1160 callbacks suppressed
    Quota error (device zram1): write_blk: dquota write failed
    Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
    Quota error (device zram1): write_blk: dquota write failed
    Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
    Quota error (device zram1): write_blk: dquota write failed
    Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
    Quota error (device zram1): write_blk: dquota write failed
    Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
    Quota error (device zram1): write_blk: dquota write failed
    Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
    VFS: Busy inodes after unmount of zram1. Self-destruct in 5 seconds. Have a nice day...

    If we failed in below path due to fail to write dquot block, we will miss
    to release quota inode, fix it.

    - f2fs_put_super
    - f2fs_quota_off_umount
    - f2fs_quota_off
    - f2fs_quota_sync
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Yunlei He
     
  • [ Upstream commit 19c73a691ccf6fb2f12d4e9cf9830023966cec88 ]

    Testcase to reproduce this bug:
    1. mkfs.f2fs /dev/sdd
    2. mount -t f2fs /dev/sdd /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. sync
    5. chattr +A /mnt/f2fs/file
    6. xfs_io -f /mnt/f2fs/file -c "fsync"
    7. godown /mnt/f2fs
    8. umount /mnt/f2fs
    9. mount -t f2fs /dev/sdd /mnt/f2fs
    10. lsattr /mnt/f2fs/file

    -----------------N- /mnt/f2fs/file

    But actually, we expect the corrct result is:

    -------A---------N- /mnt/f2fs/file

    The reason is we didn't recover inode.i_flags field during mount,
    fix it.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     

13 Oct, 2018

1 commit

  • commit d3f07c049dab1a3f1740f476afd3d5e5b738c21c upstream.

    syzbot found the following crash on:

    HEAD commit: d9bd94c0bcaa Add linux-next specific files for 20180801
    git tree: linux-next
    console output: https://syzkaller.appspot.com/x/log.txt?x=1001189c400000
    kernel config: https://syzkaller.appspot.com/x/.config?x=cc8964ea4d04518c
    dashboard link: https://syzkaller.appspot.com/bug?extid=c966a82db0b14aa37e81
    compiler: gcc (GCC) 8.0.1 20180413 (experimental)

    Unfortunately, I don't have any reproducer for this crash yet.

    IMPORTANT: if you fix the bug, please add the following tag to the commit:
    Reported-by: syzbot+c966a82db0b14aa37e81@syzkaller.appspotmail.com

    loop7: rw=12288, want=8200, limit=20
    netlink: 65342 bytes leftover after parsing attributes in process `syz-executor4'.
    openvswitch: netlink: Message has 8 unknown bytes.
    kasan: CONFIG_KASAN_INLINE enabled
    kasan: GPF could be caused by NULL-ptr deref or user memory access
    general protection fault: 0000 [#1] SMP KASAN
    CPU: 1 PID: 7615 Comm: syz-executor7 Not tainted 4.18.0-rc7-next-20180801+ #29
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:__read_once_size include/linux/compiler.h:188 [inline]
    RIP: 0010:compound_head include/linux/page-flags.h:142 [inline]
    RIP: 0010:PageLocked include/linux/page-flags.h:272 [inline]
    RIP: 0010:f2fs_put_page fs/f2fs/f2fs.h:2011 [inline]
    RIP: 0010:validate_checkpoint+0x66d/0xec0 fs/f2fs/checkpoint.c:835
    Code: e8 58 05 7f fe 4c 8d 6b 80 4d 8d 74 24 08 48 b8 00 00 00 00 00 fc ff df 4c 89 ea 48 c1 ea 03 c6 04 02 00 4c 89 f2 48 c1 ea 03 3c 02 00 0f 85 f4 06 00 00 4c 89 ea 4d 8b 7c 24 08 48 b8 00 00
    RSP: 0018:ffff8801937cebe8 EFLAGS: 00010246
    RAX: dffffc0000000000 RBX: ffff8801937cef30 RCX: ffffc90006035000
    RDX: 0000000000000000 RSI: ffffffff82fd9658 RDI: 0000000000000005
    RBP: ffff8801937cef58 R08: ffff8801ab254700 R09: fffff94000d9e026
    R10: fffff94000d9e026 R11: ffffea0006cf0137 R12: fffffffffffffffb
    R13: ffff8801937ceeb0 R14: 0000000000000003 R15: ffff880193419b40
    FS: 00007f36a61d5700(0000) GS:ffff8801db100000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fc04ff93000 CR3: 00000001d0562000 CR4: 00000000001426e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    f2fs_get_valid_checkpoint+0x436/0x1ec0 fs/f2fs/checkpoint.c:860
    f2fs_fill_super+0x2d42/0x8110 fs/f2fs/super.c:2883
    mount_bdev+0x314/0x3e0 fs/super.c:1344
    f2fs_mount+0x3c/0x50 fs/f2fs/super.c:3133
    legacy_get_tree+0x131/0x460 fs/fs_context.c:729
    vfs_get_tree+0x1cb/0x5c0 fs/super.c:1743
    do_new_mount fs/namespace.c:2603 [inline]
    do_mount+0x6f2/0x1e20 fs/namespace.c:2927
    ksys_mount+0x12d/0x140 fs/namespace.c:3143
    __do_sys_mount fs/namespace.c:3157 [inline]
    __se_sys_mount fs/namespace.c:3154 [inline]
    __x64_sys_mount+0xbe/0x150 fs/namespace.c:3154
    do_syscall_64+0x1b9/0x820 arch/x86/entry/common.c:290
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x45943a
    Code: b8 a6 00 00 00 0f 05 48 3d 01 f0 ff ff 0f 83 bd 8a fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 0f 83 9a 8a fb ff c3 66 0f 1f 84 00 00 00 00 00
    RSP: 002b:00007f36a61d4a88 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    RAX: ffffffffffffffda RBX: 00007f36a61d4b30 RCX: 000000000045943a
    RDX: 00007f36a61d4ad0 RSI: 0000000020000100 RDI: 00007f36a61d4af0
    RBP: 0000000020000100 R08: 00007f36a61d4b30 R09: 00007f36a61d4ad0
    R10: 0000000000000000 R11: 0000000000000206 R12: 0000000000000013
    R13: 0000000000000000 R14: 00000000004c8ea0 R15: 0000000000000000
    Modules linked in:
    Dumping ftrace buffer:
    (ftrace buffer empty)
    ---[ end trace bd8550c129352286 ]---
    RIP: 0010:__read_once_size include/linux/compiler.h:188 [inline]
    RIP: 0010:compound_head include/linux/page-flags.h:142 [inline]
    RIP: 0010:PageLocked include/linux/page-flags.h:272 [inline]
    RIP: 0010:f2fs_put_page fs/f2fs/f2fs.h:2011 [inline]
    RIP: 0010:validate_checkpoint+0x66d/0xec0 fs/f2fs/checkpoint.c:835
    Code: e8 58 05 7f fe 4c 8d 6b 80 4d 8d 74 24 08 48 b8 00 00 00 00 00 fc ff df 4c 89 ea 48 c1 ea 03 c6 04 02 00 4c 89 f2 48 c1 ea 03 3c 02 00 0f 85 f4 06 00 00 4c 89 ea 4d 8b 7c 24 08 48 b8 00 00
    RSP: 0018:ffff8801937cebe8 EFLAGS: 00010246
    RAX: dffffc0000000000 RBX: ffff8801937cef30 RCX: ffffc90006035000
    RDX: 0000000000000000 RSI: ffffffff82fd9658 RDI: 0000000000000005
    netlink: 65342 bytes leftover after parsing attributes in process `syz-executor4'.
    RBP: ffff8801937cef58 R08: ffff8801ab254700 R09: fffff94000d9e026
    openvswitch: netlink: Message has 8 unknown bytes.
    R10: fffff94000d9e026 R11: ffffea0006cf0137 R12: fffffffffffffffb
    R13: ffff8801937ceeb0 R14: 0000000000000003 R15: ffff880193419b40
    FS: 00007f36a61d5700(0000) GS:ffff8801db100000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fc04ff93000 CR3: 00000001d0562000 CR4: 00000000001426e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400

    In validate_checkpoint(), if we failed to call get_checkpoint_version(), we
    will pass returned invalid page pointer into f2fs_put_page, cause accessing
    invalid memory, this patch tries to handle error path correctly to fix this
    issue.

    Signed-off-by: Chao Yu
    Signed-off-by: Greg Kroah-Hartman

    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

20 Sep, 2018

9 commits

  • [ Upstream commit c77ec61ca0a49544ca81881cc5d5529858f7e196 ]

    This patch adds to do sanity check with {sit,nat}_ver_bitmap_bytesize
    during mount, in order to avoid accessing across cache boundary with
    this abnormal bitmap size.

    - Overview
    buffer overrun in build_sit_info() when mounting a crafted f2fs image

    - Reproduce

    - Kernel message
    [ 548.580867] F2FS-fs (loop0): Invalid log blocks per segment (8201)

    [ 548.580877] F2FS-fs (loop0): Can't find valid F2FS filesystem in 1th superblock
    [ 548.584979] ==================================================================
    [ 548.586568] BUG: KASAN: use-after-free in kmemdup+0x36/0x50
    [ 548.587715] Read of size 64 at addr ffff8801e9c265ff by task mount/1295

    [ 548.589428] CPU: 1 PID: 1295 Comm: mount Not tainted 4.18.0-rc1+ #4
    [ 548.589432] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 548.589438] Call Trace:
    [ 548.589474] dump_stack+0x7b/0xb5
    [ 548.589487] print_address_description+0x70/0x290
    [ 548.589492] kasan_report+0x291/0x390
    [ 548.589496] ? kmemdup+0x36/0x50
    [ 548.589509] check_memory_region+0x139/0x190
    [ 548.589514] memcpy+0x23/0x50
    [ 548.589518] kmemdup+0x36/0x50
    [ 548.589545] f2fs_build_segment_manager+0x8fa/0x3410
    [ 548.589551] ? __asan_loadN+0xf/0x20
    [ 548.589560] ? f2fs_sanity_check_ckpt+0x1be/0x240
    [ 548.589566] ? f2fs_flush_sit_entries+0x10c0/0x10c0
    [ 548.589587] ? __put_user_ns+0x40/0x40
    [ 548.589604] ? find_next_bit+0x57/0x90
    [ 548.589610] f2fs_fill_super+0x194b/0x2b40
    [ 548.589617] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.589637] ? set_blocksize+0x90/0x140
    [ 548.589651] mount_bdev+0x1c5/0x210
    [ 548.589655] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.589667] f2fs_mount+0x15/0x20
    [ 548.589672] mount_fs+0x60/0x1a0
    [ 548.589683] ? alloc_vfsmnt+0x309/0x360
    [ 548.589688] vfs_kern_mount+0x6b/0x1a0
    [ 548.589699] do_mount+0x34a/0x18c0
    [ 548.589710] ? lockref_put_or_lock+0xcf/0x160
    [ 548.589716] ? copy_mount_string+0x20/0x20
    [ 548.589728] ? memcg_kmem_put_cache+0x1b/0xa0
    [ 548.589734] ? kasan_check_write+0x14/0x20
    [ 548.589740] ? _copy_from_user+0x6a/0x90
    [ 548.589744] ? memdup_user+0x42/0x60
    [ 548.589750] ksys_mount+0x83/0xd0
    [ 548.589755] __x64_sys_mount+0x67/0x80
    [ 548.589781] do_syscall_64+0x78/0x170
    [ 548.589797] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 548.589820] RIP: 0033:0x7f76fc331b9a
    [ 548.589821] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 548.589880] RSP: 002b:00007ffd4f0a0e48 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 548.589890] RAX: ffffffffffffffda RBX: 000000000146c030 RCX: 00007f76fc331b9a
    [ 548.589892] RDX: 000000000146c210 RSI: 000000000146df30 RDI: 0000000001474ec0
    [ 548.589895] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 548.589897] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 0000000001474ec0
    [ 548.589900] R13: 000000000146c210 R14: 0000000000000000 R15: 0000000000000003

    [ 548.590242] The buggy address belongs to the page:
    [ 548.591243] page:ffffea0007a70980 count:0 mapcount:0 mapping:0000000000000000 index:0x0
    [ 548.592886] flags: 0x2ffff0000000000()
    [ 548.593665] raw: 02ffff0000000000 dead000000000100 dead000000000200 0000000000000000
    [ 548.595258] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
    [ 548.603713] page dumped because: kasan: bad access detected

    [ 548.605203] Memory state around the buggy address:
    [ 548.606198] ffff8801e9c26480: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.607676] ffff8801e9c26500: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.609157] >ffff8801e9c26580: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.610629] ^
    [ 548.612088] ffff8801e9c26600: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.613674] ffff8801e9c26680: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    [ 548.615141] ==================================================================
    [ 548.616613] Disabling lock debugging due to kernel taint
    [ 548.622871] WARNING: CPU: 1 PID: 1295 at mm/page_alloc.c:4065 __alloc_pages_slowpath+0xe4a/0x1420
    [ 548.622878] Modules linked in: snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd mac_hid i2c_piix4 soundcore ib_iser rdma_cm iw_cm ib_cm ib_core iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx raid1 raid0 multipath linear 8139too crct10dif_pclmul crc32_pclmul qxl drm_kms_helper syscopyarea aesni_intel sysfillrect sysimgblt fb_sys_fops ttm drm aes_x86_64 crypto_simd cryptd 8139cp glue_helper mii pata_acpi floppy
    [ 548.623217] CPU: 1 PID: 1295 Comm: mount Tainted: G B 4.18.0-rc1+ #4
    [ 548.623219] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 548.623226] RIP: 0010:__alloc_pages_slowpath+0xe4a/0x1420
    [ 548.623227] Code: ff ff 01 89 85 c8 fe ff ff e9 91 fc ff ff 41 89 c5 e9 5c fc ff ff 0f 0b 89 f8 25 ff ff f7 ff 89 85 8c fe ff ff e9 d5 f2 ff ff 0b e9 65 f2 ff ff 65 8b 05 38 81 d2 47 f6 c4 01 74 1c 65 48 8b
    [ 548.623281] RSP: 0018:ffff8801f28c7678 EFLAGS: 00010246
    [ 548.623284] RAX: 0000000000000000 RBX: 00000000006040c0 RCX: ffffffffb82f73b7
    [ 548.623287] RDX: 1ffff1003e518eeb RSI: 000000000000000c RDI: 0000000000000000
    [ 548.623290] RBP: ffff8801f28c7880 R08: 0000000000000000 R09: ffffed0047fff2c5
    [ 548.623292] R10: 0000000000000001 R11: ffffed0047fff2c4 R12: ffff8801e88de040
    [ 548.623295] R13: 00000000006040c0 R14: 000000000000000c R15: ffff8801f28c7938
    [ 548.623299] FS: 00007f76fca51840(0000) GS:ffff8801f6f00000(0000) knlGS:0000000000000000
    [ 548.623302] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 548.623304] CR2: 00007f19b9171760 CR3: 00000001ed952000 CR4: 00000000000006e0
    [ 548.623317] Call Trace:
    [ 548.623325] ? kasan_check_read+0x11/0x20
    [ 548.623330] ? __zone_watermark_ok+0x92/0x240
    [ 548.623336] ? get_page_from_freelist+0x1c3/0x1d90
    [ 548.623347] ? _raw_spin_lock_irqsave+0x2a/0x60
    [ 548.623353] ? warn_alloc+0x250/0x250
    [ 548.623358] ? save_stack+0x46/0xd0
    [ 548.623361] ? kasan_kmalloc+0xad/0xe0
    [ 548.623366] ? __isolate_free_page+0x2a0/0x2a0
    [ 548.623370] ? mount_fs+0x60/0x1a0
    [ 548.623374] ? vfs_kern_mount+0x6b/0x1a0
    [ 548.623378] ? do_mount+0x34a/0x18c0
    [ 548.623383] ? ksys_mount+0x83/0xd0
    [ 548.623387] ? __x64_sys_mount+0x67/0x80
    [ 548.623391] ? do_syscall_64+0x78/0x170
    [ 548.623396] ? entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 548.623401] __alloc_pages_nodemask+0x3c5/0x400
    [ 548.623407] ? __alloc_pages_slowpath+0x1420/0x1420
    [ 548.623412] ? __mutex_lock_slowpath+0x20/0x20
    [ 548.623417] ? kvmalloc_node+0x31/0x80
    [ 548.623424] alloc_pages_current+0x75/0x110
    [ 548.623436] kmalloc_order+0x24/0x60
    [ 548.623442] kmalloc_order_trace+0x24/0xb0
    [ 548.623448] __kmalloc_track_caller+0x207/0x220
    [ 548.623455] ? f2fs_build_node_manager+0x399/0xbb0
    [ 548.623460] kmemdup+0x20/0x50
    [ 548.623465] f2fs_build_node_manager+0x399/0xbb0
    [ 548.623470] f2fs_fill_super+0x195e/0x2b40
    [ 548.623477] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.623481] ? set_blocksize+0x90/0x140
    [ 548.623486] mount_bdev+0x1c5/0x210
    [ 548.623489] ? f2fs_commit_super+0x1b0/0x1b0
    [ 548.623495] f2fs_mount+0x15/0x20
    [ 548.623498] mount_fs+0x60/0x1a0
    [ 548.623503] ? alloc_vfsmnt+0x309/0x360
    [ 548.623508] vfs_kern_mount+0x6b/0x1a0
    [ 548.623513] do_mount+0x34a/0x18c0
    [ 548.623518] ? lockref_put_or_lock+0xcf/0x160
    [ 548.623523] ? copy_mount_string+0x20/0x20
    [ 548.623528] ? memcg_kmem_put_cache+0x1b/0xa0
    [ 548.623533] ? kasan_check_write+0x14/0x20
    [ 548.623537] ? _copy_from_user+0x6a/0x90
    [ 548.623542] ? memdup_user+0x42/0x60
    [ 548.623547] ksys_mount+0x83/0xd0
    [ 548.623552] __x64_sys_mount+0x67/0x80
    [ 548.623557] do_syscall_64+0x78/0x170
    [ 548.623562] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 548.623566] RIP: 0033:0x7f76fc331b9a
    [ 548.623567] Code: 48 8b 0d 01 c3 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 49 89 ca b8 a5 00 00 00 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d ce c2 2b 00 f7 d8 64 89 01 48
    [ 548.623632] RSP: 002b:00007ffd4f0a0e48 EFLAGS: 00000206 ORIG_RAX: 00000000000000a5
    [ 548.623636] RAX: ffffffffffffffda RBX: 000000000146c030 RCX: 00007f76fc331b9a
    [ 548.623639] RDX: 000000000146c210 RSI: 000000000146df30 RDI: 0000000001474ec0
    [ 548.623641] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000013
    [ 548.623643] R10: 00000000c0ed0000 R11: 0000000000000206 R12: 0000000001474ec0
    [ 548.623646] R13: 000000000146c210 R14: 0000000000000000 R15: 0000000000000003
    [ 548.623650] ---[ end trace 4ce02f25ff7d3df5 ]---
    [ 548.623656] F2FS-fs (loop0): Failed to initialize F2FS node manager
    [ 548.627936] F2FS-fs (loop0): Invalid log blocks per segment (8201)

    [ 548.627940] F2FS-fs (loop0): Can't find valid F2FS filesystem in 1th superblock
    [ 548.635835] F2FS-fs (loop0): Failed to initialize F2FS node manager

    - Location
    https://elixir.bootlin.com/linux/v4.18-rc1/source/fs/f2fs/segment.c#L3578

    sit_i->sit_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);

    Buffer overrun happens when doing memcpy. I suspect there is missing (inconsistent) checks on bitmap_size.

    Reported by Wen Xu (wen.xu@gatech.edu) from SSLab, Gatech.

    Reported-by: Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 2a96d8ad94ce57cb0072f7a660b1039720c47716 ]

    "ret" can be uninitialized on the success path when "in ==
    F2FS_GOING_DOWN_FULLSYNC".

    Fixes: 60b2b4ee2bc0 ("f2fs: Fix deadlock in shutdown ioctl")
    Signed-off-by: Dan Carpenter
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Dan Carpenter
     
  • [ Upstream commit 6aead1617b3adf2b7e2c56f0f13e4e0ee42ebb4a ]

    In error path of f2fs_move_rehashed_dirents, inode page could be writeback
    state, so we should wait on inode page writeback before updating it.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 4dbe38dc386910c668c75ae616b99b823b59f3eb ]

    As Wen Xu reported in bugzilla, after image was injected with random data
    by fuzzing, inline inode would contain invalid reserved blkaddr, then
    during inline conversion, we will encounter illegal memory accessing
    reported by KASAN, the root cause of this is when writing out converted
    inline page, we will use invalid reserved blkaddr to update sit bitmap,
    result in accessing memory beyond sit bitmap boundary.

    In order to fix this issue, let's do sanity check with reserved block
    address of inline inode to avoid above condition.

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

    [ 1428.846352] BUG: KASAN: use-after-free in update_sit_entry+0x80/0x7f0
    [ 1428.846618] Read of size 4 at addr ffff880194483540 by task a.out/2741

    [ 1428.846855] CPU: 0 PID: 2741 Comm: a.out Tainted: G W 4.17.0+ #1
    [ 1428.846858] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014
    [ 1428.846860] Call Trace:
    [ 1428.846868] dump_stack+0x71/0xab
    [ 1428.846875] print_address_description+0x6b/0x290
    [ 1428.846881] kasan_report+0x28e/0x390
    [ 1428.846888] ? update_sit_entry+0x80/0x7f0
    [ 1428.846898] update_sit_entry+0x80/0x7f0
    [ 1428.846906] f2fs_allocate_data_block+0x6db/0xc70
    [ 1428.846914] ? f2fs_get_node_info+0x14f/0x590
    [ 1428.846920] do_write_page+0xc8/0x150
    [ 1428.846928] f2fs_outplace_write_data+0xfe/0x210
    [ 1428.846935] ? f2fs_do_write_node_page+0x170/0x170
    [ 1428.846941] ? radix_tree_tag_clear+0xff/0x130
    [ 1428.846946] ? __mod_node_page_state+0x22/0xa0
    [ 1428.846951] ? inc_zone_page_state+0x54/0x100
    [ 1428.846956] ? __test_set_page_writeback+0x336/0x5d0
    [ 1428.846964] f2fs_convert_inline_page+0x407/0x6d0
    [ 1428.846971] ? f2fs_read_inline_data+0x3b0/0x3b0
    [ 1428.846978] ? __get_node_page+0x335/0x6b0
    [ 1428.846987] f2fs_convert_inline_inode+0x41b/0x500
    [ 1428.846994] ? f2fs_convert_inline_page+0x6d0/0x6d0
    [ 1428.847000] ? kasan_unpoison_shadow+0x31/0x40
    [ 1428.847005] ? kasan_kmalloc+0xa6/0xd0
    [ 1428.847024] f2fs_file_mmap+0x79/0xc0
    [ 1428.847029] mmap_region+0x58b/0x880
    [ 1428.847037] ? arch_get_unmapped_area+0x370/0x370
    [ 1428.847042] do_mmap+0x55b/0x7a0
    [ 1428.847048] vm_mmap_pgoff+0x16f/0x1c0
    [ 1428.847055] ? vma_is_stack_for_current+0x50/0x50
    [ 1428.847062] ? __fsnotify_update_child_dentry_flags.part.1+0x160/0x160
    [ 1428.847068] ? do_sys_open+0x206/0x2a0
    [ 1428.847073] ? __fget+0xb4/0x100
    [ 1428.847079] ksys_mmap_pgoff+0x278/0x360
    [ 1428.847085] ? find_mergeable_anon_vma+0x50/0x50
    [ 1428.847091] do_syscall_64+0x73/0x160
    [ 1428.847098] entry_SYSCALL_64_after_hwframe+0x44/0xa9
    [ 1428.847102] RIP: 0033:0x7fb1430766ba
    [ 1428.847103] Code: 89 f5 41 54 49 89 fc 55 53 74 35 49 63 e8 48 63 da 4d 89 f9 49 89 e8 4d 63 d6 48 89 da 4c 89 ee 4c 89 e7 b8 09 00 00 00 0f 05 3d 00 f0 ff ff 77 56 5b 5d 41 5c 41 5d 41 5e 41 5f c3 0f 1f 00
    [ 1428.847162] RSP: 002b:00007ffc651d9388 EFLAGS: 00000246 ORIG_RAX: 0000000000000009
    [ 1428.847167] RAX: ffffffffffffffda RBX: 0000000000000001 RCX: 00007fb1430766ba
    [ 1428.847170] RDX: 0000000000000001 RSI: 0000000000001000 RDI: 0000000000000000
    [ 1428.847173] RBP: 0000000000000003 R08: 0000000000000003 R09: 0000000000000000
    [ 1428.847176] R10: 0000000000008002 R11: 0000000000000246 R12: 0000000000000000
    [ 1428.847179] R13: 0000000000001000 R14: 0000000000008002 R15: 0000000000000000

    [ 1428.847252] Allocated by task 2683:
    [ 1428.847372] kasan_kmalloc+0xa6/0xd0
    [ 1428.847380] kmem_cache_alloc+0xc8/0x1e0
    [ 1428.847385] getname_flags+0x73/0x2b0
    [ 1428.847390] user_path_at_empty+0x1d/0x40
    [ 1428.847395] vfs_statx+0xc1/0x150
    [ 1428.847401] __do_sys_newlstat+0x7e/0xd0
    [ 1428.847405] do_syscall_64+0x73/0x160
    [ 1428.847411] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 1428.847466] Freed by task 2683:
    [ 1428.847566] __kasan_slab_free+0x137/0x190
    [ 1428.847571] kmem_cache_free+0x85/0x1e0
    [ 1428.847575] filename_lookup+0x191/0x280
    [ 1428.847580] vfs_statx+0xc1/0x150
    [ 1428.847585] __do_sys_newlstat+0x7e/0xd0
    [ 1428.847590] do_syscall_64+0x73/0x160
    [ 1428.847596] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    [ 1428.847648] The buggy address belongs to the object at ffff880194483300
    which belongs to the cache names_cache of size 4096
    [ 1428.847946] The buggy address is located 576 bytes inside of
    4096-byte region [ffff880194483300, ffff880194484300)
    [ 1428.848234] The buggy address belongs to the page:
    [ 1428.848366] page:ffffea0006512000 count:1 mapcount:0 mapping:ffff8801f3586380 index:0x0 compound_mapcount: 0
    [ 1428.848606] flags: 0x17fff8000008100(slab|head)
    [ 1428.848737] raw: 017fff8000008100 dead000000000100 dead000000000200 ffff8801f3586380
    [ 1428.848931] raw: 0000000000000000 0000000000070007 00000001ffffffff 0000000000000000
    [ 1428.849122] page dumped because: kasan: bad access detected

    [ 1428.849305] Memory state around the buggy address:
    [ 1428.849436] ffff880194483400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.849620] ffff880194483480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.849804] >ffff880194483500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.849985] ^
    [ 1428.850120] ffff880194483580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.850303] ffff880194483600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
    [ 1428.850498] ==================================================================

    Reported-by: Wen Xu
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 10d255c3540239c7920f52d2eb223756e186af56 ]

    If segment type in SSA and SIT is inconsistent, we will encounter below
    BUG_ON during GC, to avoid this panic, let's just skip doing GC on such
    segment.

    The bug is triggered with image reported in below link:

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

    [ 388.060262] ------------[ cut here ]------------
    [ 388.060268] kernel BUG at /home/y00370721/git/devf2fs/gc.c:989!
    [ 388.061172] invalid opcode: 0000 [#1] SMP
    [ 388.061773] Modules linked in: f2fs(O) bluetooth ecdh_generic xt_tcpudp iptable_filter ip_tables x_tables lp ttm drm_kms_helper drm intel_rapl sb_edac crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel fb_sys_fops ppdev aes_x86_64 syscopyarea crypto_simd sysfillrect parport_pc joydev sysimgblt glue_helper parport cryptd i2c_piix4 serio_raw mac_hid btrfs hid_generic usbhid hid raid6_pq psmouse pata_acpi floppy
    [ 388.064247] CPU: 7 PID: 4151 Comm: f2fs_gc-7:0 Tainted: G O 4.13.0-rc1+ #26
    [ 388.065306] Hardware name: Xen HVM domU, BIOS 4.1.2_115-900.260_ 11/06/2015
    [ 388.066058] task: ffff880201583b80 task.stack: ffffc90004d7c000
    [ 388.069948] RIP: 0010:do_garbage_collect+0xcc8/0xcd0 [f2fs]
    [ 388.070766] RSP: 0018:ffffc90004d7fc68 EFLAGS: 00010202
    [ 388.071783] RAX: ffff8801ed227000 RBX: 0000000000000001 RCX: ffffea0007b489c0
    [ 388.072700] RDX: ffff880000000000 RSI: 0000000000000001 RDI: ffffea0007b489c0
    [ 388.073607] RBP: ffffc90004d7fd58 R08: 0000000000000003 R09: ffffea0007b489dc
    [ 388.074619] R10: 0000000000000000 R11: 0052782ab317138d R12: 0000000000000018
    [ 388.075625] R13: 0000000000000018 R14: ffff880211ceb000 R15: ffff880211ceb000
    [ 388.076687] FS: 0000000000000000(0000) GS:ffff880214fc0000(0000) knlGS:0000000000000000
    [ 388.083277] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 388.084536] CR2: 0000000000e18c60 CR3: 00000001ecf2e000 CR4: 00000000001406e0
    [ 388.085748] Call Trace:
    [ 388.086690] ? find_next_bit+0xb/0x10
    [ 388.088091] f2fs_gc+0x1a8/0x9d0 [f2fs]
    [ 388.088888] ? lock_timer_base+0x7d/0xa0
    [ 388.090213] ? try_to_del_timer_sync+0x44/0x60
    [ 388.091698] gc_thread_func+0x342/0x4b0 [f2fs]
    [ 388.092892] ? wait_woken+0x80/0x80
    [ 388.094098] kthread+0x109/0x140
    [ 388.095010] ? f2fs_gc+0x9d0/0x9d0 [f2fs]
    [ 388.096043] ? kthread_park+0x60/0x60
    [ 388.097281] ret_from_fork+0x25/0x30
    [ 388.098401] Code: ff ff 48 83 e8 01 48 89 44 24 58 e9 27 f8 ff ff 48 83 e8 01 e9 78 fc ff ff 48 8d 78 ff e9 17 fb ff ff 48 83 ef 01 e9 4d f4 ff ff 0b 66 0f 1f 44 00 00 0f 1f 44 00 00 55 48 89 e5 41 56 41 55
    [ 388.100864] RIP: do_garbage_collect+0xcc8/0xcd0 [f2fs] RSP: ffffc90004d7fc68
    [ 388.101810] ---[ end trace 81c73d6e6b7da61d ]---

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 4b270a8cc5047682f0a3f3f9af3b498408dbd2bc ]

    In synchronous scenario, like in checkpoint(), we are going to flush
    dirty node pages to device synchronously, we can easily failed
    writebacking node page due to trylock_page() failure, especially in
    condition of intensive lock competition, which can cause long latency
    of checkpoint(). So let's use lock_page() in synchronous scenario to
    avoid this issue.

    Signed-off-by: Yunlei He
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit cb15d1e43db0a6341c1e26ac6a2c74e61b74f1aa ]

    Fix build warnings in f2fs when CONFIG_PROC_FS is not enabled
    by marking the unused functions as __maybe_unused.

    ../fs/f2fs/sysfs.c:519:12: warning: 'segment_info_seq_show' defined but not used [-Wunused-function]
    ../fs/f2fs/sysfs.c:546:12: warning: 'segment_bits_seq_show' defined but not used [-Wunused-function]
    ../fs/f2fs/sysfs.c:570:12: warning: 'iostat_info_seq_show' defined but not used [-Wunused-function]

    Signed-off-by: Randy Dunlap
    Cc: Jaegeuk Kim
    Cc: Chao Yu
    Cc: linux-f2fs-devel@lists.sourceforge.net
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Randy Dunlap
     
  • [ Upstream commit 3611ce9911267cb93d364bd71ddea6821278d11f ]

    For the case when sbi->segs_per_sec > 1, take section:segment = 5 for
    example, if segment 1 is just used and allocate new segment 2, and the
    blocks of segment 1 is invalidated, at this time, the previous code will
    use __set_test_and_free to free the free_secmap and free_sections++,
    this is not correct since it is still a current section, so fix it.

    Signed-off-by: Yunlong Song
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Yunlong Song
     
  • [ Upstream commit 82cf4f132e6d16dca6fc3bd955019246141bc645 ]

    If config CONFIG_F2FS_FAULT_INJECTION is on, for both read or write path
    we will call find_lock_page() to get the page, but for read path, it
    missed to passing FGP_ACCESSED to allocator to active the page in LRU
    list, result in being reclaimed in advance incorrectly, fix it.

    Reported-by: Xianrong Zhou
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     

15 Sep, 2018

1 commit

  • [ Upstream commit 66110abc4c931f879d70e83e1281f891699364bf ]

    PG_checked flag will be set on data page during GC, later, we can
    recognize such page by the flag and migrate page to cold segment.

    But previously, we don't clear this flag when invalidating data page,
    after page redirtying, we will write it into wrong log.

    Let's clear PG_checked flag in set_page_dirty() to avoid this.

    Signed-off-by: Weichao Guo
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     

24 Aug, 2018

2 commits

  • commit 8a29c1260e24e7c9c6ab138aa0017558d8b28208 upstream.

    This patch enhances sanity check for SIT entries.

    syzbot hit the following crash on upstream commit
    83beed7b2b26f232d782127792dd0cd4362fdc41 (Fri Apr 20 17:56:32 2018 +0000)
    Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal
    syzbot dashboard link: https://syzkaller.appspot.com/bug?extid=bf9253040425feb155ad

    syzkaller reproducer: https://syzkaller.appspot.com/x/repro.syz?id=5692130282438656
    Raw console output: https://syzkaller.appspot.com/x/log.txt?id=5095924598571008
    Kernel config: https://syzkaller.appspot.com/x/.config?id=1808800213120130118
    compiler: gcc (GCC) 8.0.1 20180413 (experimental)

    IMPORTANT: if you fix the bug, please add the following tag to the commit:
    Reported-by: syzbot+bf9253040425feb155ad@syzkaller.appspotmail.com
    It will help syzbot understand when the bug is fixed. See footer for details.
    If you forward the report, please keep this part and the footer.

    F2FS-fs (loop0): invalid crc value
    F2FS-fs (loop0): Try to recover 1th superblock, ret: 0
    F2FS-fs (loop0): Mounted with checkpoint version = d
    F2FS-fs (loop0): Bitmap was wrongly cleared, blk:9740
    ------------[ cut here ]------------
    kernel BUG at fs/f2fs/segment.c:1884!
    invalid opcode: 0000 [#1] SMP KASAN
    Dumping ftrace buffer:
    (ftrace buffer empty)
    Modules linked in:
    CPU: 1 PID: 4508 Comm: syz-executor0 Not tainted 4.17.0-rc1+ #10
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:update_sit_entry+0x1215/0x1590 fs/f2fs/segment.c:1882
    RSP: 0018:ffff8801af526708 EFLAGS: 00010282
    RAX: ffffed0035ea4cc0 RBX: ffff8801ad454f90 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: ffffffff82eeb87e RDI: ffffed0035ea4cb6
    RBP: ffff8801af526760 R08: ffff8801ad4a2480 R09: ffffed003b5e4f90
    R10: ffffed003b5e4f90 R11: ffff8801daf27c87 R12: ffff8801adb8d380
    R13: 0000000000000001 R14: 0000000000000008 R15: 00000000ffffffff
    FS: 00000000014af940(0000) GS:ffff8801daf00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007f06bc223000 CR3: 00000001adb02000 CR4: 00000000001406e0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    allocate_data_block+0x66f/0x2050 fs/f2fs/segment.c:2663
    do_write_page+0x105/0x1b0 fs/f2fs/segment.c:2727
    write_node_page+0x129/0x350 fs/f2fs/segment.c:2770
    __write_node_page+0x7da/0x1370 fs/f2fs/node.c:1398
    sync_node_pages+0x18cf/0x1eb0 fs/f2fs/node.c:1652
    block_operations+0x429/0xa60 fs/f2fs/checkpoint.c:1088
    write_checkpoint+0x3ba/0x5380 fs/f2fs/checkpoint.c:1405
    f2fs_sync_fs+0x2fb/0x6a0 fs/f2fs/super.c:1077
    __sync_filesystem fs/sync.c:39 [inline]
    sync_filesystem+0x265/0x310 fs/sync.c:67
    generic_shutdown_super+0xd7/0x520 fs/super.c:429
    kill_block_super+0xa4/0x100 fs/super.c:1191
    kill_f2fs_super+0x9f/0xd0 fs/f2fs/super.c:3030
    deactivate_locked_super+0x97/0x100 fs/super.c:316
    deactivate_super+0x188/0x1b0 fs/super.c:347
    cleanup_mnt+0xbf/0x160 fs/namespace.c:1174
    __cleanup_mnt+0x16/0x20 fs/namespace.c:1181
    task_work_run+0x1e4/0x290 kernel/task_work.c:113
    tracehook_notify_resume include/linux/tracehook.h:191 [inline]
    exit_to_usermode_loop+0x2bd/0x310 arch/x86/entry/common.c:166
    prepare_exit_to_usermode arch/x86/entry/common.c:196 [inline]
    syscall_return_slowpath arch/x86/entry/common.c:265 [inline]
    do_syscall_64+0x6ac/0x800 arch/x86/entry/common.c:290
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x457d97
    RSP: 002b:00007ffd46f9c8e8 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000457d97
    RDX: 00000000014b09a3 RSI: 0000000000000002 RDI: 00007ffd46f9da50
    RBP: 00007ffd46f9da50 R08: 0000000000000000 R09: 0000000000000009
    R10: 0000000000000005 R11: 0000000000000246 R12: 00000000014b0940
    R13: 0000000000000000 R14: 0000000000000002 R15: 000000000000658e
    RIP: update_sit_entry+0x1215/0x1590 fs/f2fs/segment.c:1882 RSP: ffff8801af526708
    ---[ end trace f498328bb02610a2 ]---

    Reported-and-tested-by: syzbot+bf9253040425feb155ad@syzkaller.appspotmail.com
    Reported-and-tested-by: syzbot+7d6d31d3bc702f566ce3@syzkaller.appspotmail.com
    Reported-and-tested-by: syzbot+0a725420475916460f12@syzkaller.appspotmail.com
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     
  • commit c39a1b348c4fe172729eff77c533dabc3c7cdaa7 upstream.

    Let's avoid BUG_ON during fill_super, when on-disk was totall corrupted.

    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     

03 Aug, 2018

6 commits

  • [ Upstream commit 5b19d284f5195a925dd015a6397bfce184097378 ]

    pageout() in MM traslates EAGAIN, so calls handle_write_error()
    -> mapping_set_error() -> set_bit(AS_EIO, ...).
    file_write_and_wait_range() will see EIO error, which is critical
    to return value of fsync() followed by atomic_write failure to user.

    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Jaegeuk Kim
     
  • [ Upstream commit 27319ba4044c0c67d62ae39e53c0118c89f0a029 ]

    Thread GC thread
    - f2fs_ioc_start_atomic_write
    - get_dirty_pages
    - filemap_write_and_wait_range
    - f2fs_gc
    - do_garbage_collect
    - gc_data_segment
    - move_data_page
    - f2fs_is_atomic_file
    - set_page_dirty
    - set_inode_flag(, FI_ATOMIC_FILE)

    Dirty data page can still be generated by GC in race condition as
    above call stack.

    This patch adds fi->dio_rwsem[WRITE] in f2fs_ioc_start_atomic_write
    to avoid such race.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit c22aecd75919511abea872b201751e0be1add898 ]

    dquot_initialize() can fail due to any exception inside quota subsystem,
    f2fs needs to be aware of it, and return correct return value to caller.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 60b2b4ee2bc01dd052f99fa9d65da2232102ef8e ]

    f2fs_ioc_shutdown() ioctl gets stuck in the below path
    when issued with F2FS_GOING_DOWN_FULLSYNC option.

    __switch_to+0x90/0xc4
    percpu_down_write+0x8c/0xc0
    freeze_super+0xec/0x1e4
    freeze_bdev+0xc4/0xcc
    f2fs_ioctl+0xc0c/0x1ce0
    f2fs_compat_ioctl+0x98/0x1f0

    Signed-off-by: Sahitya Tummala
    Reviewed-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sahitya Tummala
     
  • [ Upstream commit e5e5732d8120654159254c16834bc8663d8be124 ]

    After revoking atomic write, related LBA can be reused by others, so we
    need to wait page writeback before reusing the LBA, in order to avoid
    interference between old atomic written in-flight IO and new IO.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu
     
  • [ Upstream commit 64c74a7ab505ea40d1b3e5d02735ecab08ae1b14 ]

    - f2fs_fill_super
    - recover_fsync_data
    - recover_data
    - del_fsync_inode
    - iput
    - iput_final
    - write_inode_now
    - f2fs_write_inode
    - f2fs_balance_fs
    - f2fs_balance_fs_bg
    - sync_dirty_inodes

    With data_flush mount option, during recovery, in order to avoid entering
    above writeback flow, let's detect recovery status and do skip in
    f2fs_balance_fs_bg.

    Signed-off-by: Chao Yu
    Signed-off-by: Yunlei He
    Signed-off-by: Jaegeuk Kim
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Chao Yu