On 2019/9/15 上午4:52, Cebtenzzre wrote:
> I have been able to trigger a use-after-free in btrfs on a stock Arch
> Linux kernel, versions 5.2.9 and 5.2.11. I also reproduced it on
> kernel.org mainline 5.3-rc8, resulting in this KASAN report:
> 
> 
> [49286.511157] BTRFS info (device sdi1): balance: start 
> -dvrange=2221681934336..2221681934337
> [49286.515651] BTRFS info (device sdi1): relocating block group 2221681934336 
> flags data|raid0
> [49294.092536] 
> ==================================================================
> [49294.092637] BUG: KASAN: use-after-free in 
> btrfs_init_reloc_root+0x2bf/0x330 [btrfs]

It would be much nicer if you could provide the code context by using
1) gdb:
   $gdb fs/btrfs/btrfs.ko
    list *(btrfs_init_reloc_root+0x2bf)

2) faddr2line scripts:
   <in linux kernel source code directory>
   $ ./scripts/faddr2line fs/btrfs/btrfs.kobtrfs_init_reloc_root+0x2bf

My config results something doesn't make sense at all.

> [49294.092645] Write of size 8 at addr ffff8885b4901440 by task 
> kworker/u24:6/10894
> 
> [49294.092657] CPU: 8 PID: 10894 Comm: kworker/u24:6 Tainted: P           OE  
>    5.3.0-rc8-rc-kasan #2
> [49294.092661] Hardware name: To Be Filled By O.E.M. To Be Filled By 
> O.E.M./X99 Extreme4, BIOS P3.80 04/06/2018
> [49294.092726] Workqueue: btrfs-endio-write btrfs_endio_write_helper [btrfs]
> [49294.092730] Call Trace:
> [49294.092743]  dump_stack+0x71/0xa0
> [49294.092751]  print_address_description+0x67/0x323
> [49294.092817]  ? btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
> [49294.092879]  ? btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
> [49294.092884]  __kasan_report.cold+0x1a/0x3d
> [49294.092945]  ? btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
> [49294.092951]  kasan_report+0xe/0x12
> [49294.093012]  btrfs_init_reloc_root+0x2bf/0x330 [btrfs]
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
We need code contex of this,

> [49294.093066]  record_root_in_trans+0x2ba/0x3a0 [btrfs]
> [49294.093119]  btrfs_record_root_in_trans+0xd2/0x150 [btrfs]
> [49294.093170]  start_transaction+0x1c3/0xea0 [btrfs]
> [49294.093226]  btrfs_finish_ordered_io+0x811/0x1610 [btrfs]
> [49294.093233]  ? syscall_return_via_sysret+0xf/0x7f
> [49294.093238]  ? syscall_return_via_sysret+0xf/0x7f
> [49294.093243]  ? __switch_to_asm+0x40/0x70
> [49294.093248]  ? __switch_to_asm+0x34/0x70
> [49294.093300]  ? btrfs_unlink_subvol+0xa30/0xa30 [btrfs]
> [49294.093307]  ? finish_task_switch+0x1a1/0x760
> [49294.093312]  ? __switch_to+0x457/0xe90
> [49294.093317]  ? __switch_to_asm+0x34/0x70
> [49294.093378]  normal_work_helper+0x15a/0xb90 [btrfs]
> [49294.093387]  process_one_work+0x706/0x1200
> [49294.093394]  worker_thread+0x92/0xfb0
> [49294.093401]  ? __kthread_parkme+0x85/0x100
> [49294.093406]  ? process_one_work+0x1200/0x1200
> [49294.093410]  kthread+0x2ba/0x3b0
> [49294.093414]  ? kthread_park+0x130/0x130
> [49294.093420]  ret_from_fork+0x35/0x40
> 
> [49294.093431] Allocated by task 11689:
> [49294.093441]  __kasan_kmalloc.part.0+0x3c/0xa0
> [49294.093493]  btrfs_read_tree_root+0x8f/0x350 [btrfs]
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This,

> [49294.093542]  btrfs_read_fs_root+0xc/0xc0 [btrfs]
> [49294.093601]  create_reloc_root+0x445/0x920 [btrfs]
> [49294.093660]  btrfs_init_reloc_root+0x1da/0x330 [btrfs]
> [49294.093709]  record_root_in_trans+0x2ba/0x3a0 [btrfs]
> [49294.093758]  btrfs_record_root_in_trans+0xd2/0x150 [btrfs]
> [49294.093806]  start_transaction+0x1c3/0xea0 [btrfs]
> [49294.093856]  __btrfs_prealloc_file_range+0x1c2/0xa50 [btrfs]
> [49294.093907]  btrfs_prealloc_file_range+0x10/0x20 [btrfs]
> [49294.093966]  prealloc_file_extent_cluster+0x24e/0x4a0 [btrfs]
> [49294.094025]  relocate_file_extent_cluster+0x193/0xc90 [btrfs]
> [49294.094083]  relocate_data_extent+0x1f2/0x460 [btrfs]
> [49294.094142]  relocate_block_group+0x5a5/0xf50 [btrfs]
> [49294.094200]  btrfs_relocate_block_group+0x38f/0x990 [btrfs]
> [49294.094258]  btrfs_relocate_chunk+0x5c/0x100 [btrfs]
> [49294.094315]  btrfs_balance+0x1292/0x2f00 [btrfs]
> [49294.094373]  btrfs_ioctl_balance+0x4c2/0x6a0 [btrfs]
> [49294.094430]  btrfs_ioctl+0xe56/0x82d0 [btrfs]
> [49294.094434]  do_vfs_ioctl+0x99f/0xf10
> [49294.094437]  ksys_ioctl+0x5e/0x90
> [49294.094440]  __x64_sys_ioctl+0x6f/0xb0
> [49294.094446]  do_syscall_64+0xa0/0x370
> [49294.094451]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
> 
> [49294.094457] Freed by task 11689:
> [49294.094464]  __kasan_slab_free+0x144/0x1f0
> [49294.094468]  kfree+0x95/0x2a0
> [49294.094516]  btrfs_drop_snapshot+0x1529/0x1c40 [btrfs]
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
And this.

> [49294.094573]  clean_dirty_subvols+0x23f/0x380 [btrfs]
> [49294.094632]  relocate_block_group+0x95b/0xf50 [btrfs]
> [49294.094691]  btrfs_relocate_block_group+0x38f/0x990 [btrfs]
> [49294.094748]  btrfs_relocate_chunk+0x5c/0x100 [btrfs]
> [49294.094805]  btrfs_balance+0x1292/0x2f00 [btrfs]
> [49294.094863]  btrfs_ioctl_balance+0x4c2/0x6a0 [btrfs]
> [49294.094920]  btrfs_ioctl+0xe56/0x82d0 [btrfs]
> [49294.094923]  do_vfs_ioctl+0x99f/0xf10
> [49294.094926]  ksys_ioctl+0x5e/0x90
> [49294.094929]  __x64_sys_ioctl+0x6f/0xb0
> [49294.094934]  do_syscall_64+0xa0/0x370
> [49294.094939]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
> 
> [49294.094946] The buggy address belongs to the object at ffff8885b4901100
>                 which belongs to the cache kmalloc-2k of size 2048
> [49294.094953] The buggy address is located 832 bytes inside of
>                 2048-byte region [ffff8885b4901100, ffff8885b4901900)
> [49294.094957] The buggy address belongs to the page:
> [49294.094962] page:ffffea0016d24000 refcount:1 mapcount:0 
> mapping:ffff88864400e800 index:0x0 compound_mapcount: 0
> [49294.094968] flags: 0x2ffff0000010200(slab|head)
> [49294.094976] raw: 02ffff0000010200 dead000000000100 dead000000000122 
> ffff88864400e800
> [49294.094981] raw: 0000000000000000 00000000800f000f 00000001ffffffff 
> 0000000000000000
> [49294.094983] page dumped because: kasan: bad access detected
> 
> [49294.094987] Memory state around the buggy address:
> [49294.094992]  ffff8885b4901300: fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
> fb fb
> [49294.094997]  ffff8885b4901380: fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
> fb fb
> [49294.095002] >ffff8885b4901400: fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
> fb fb
> [49294.095006]                                            ^
> [49294.095010]  ffff8885b4901480: fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
> fb fb
> [49294.095015]  ffff8885b4901500: fb fb fb fb fb fb fb fb fb fb fb fb fb fb 
> fb fb
> [49294.095018] 
> ==================================================================
> [49301.893672] BTRFS info (device sdi1): 1 enospc errors during balance
> [49301.893675] BTRFS info (device sdi1): balance: ended with status: -28
> 
> 
> Without KASAN, I would eventually get an oops like this:
> 
>[...]
> 
> I only noticed this bug because I keep an eye on dmesg. In one instance,
> I ignored it for a few hours, then my graphics driver crashed because of
> memory allocation failure and/or heap corruption. Aside from that, I
> have seen no obvious effects.
> 
> I have hit this bug at least 5 times over the last two weeks. Every
> time, it has been caused by a balance on various volumes (typically to
> balance a single block group). I was able to trigger it somewhat
> reliably by attempting a balance on a volume with a size of 596.18GiB
> and 1.68GiB of estimated free space, but that stopped working
> eventually.

Is it always that particular fs?
Have you ever hit it on another fs?
Furthermore, did you hit it in v5.1?

I guess there is a chance my previous change of reloc tree lifespan
screwed up something, but it's introduced in v5.1...

Thanks,
Qu

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to