• Liu Bo's avatar
    Btrfs: fix use-after-free bug during umount · 2932505a
    Liu Bo authored
    Commit be283b2e
    (    Btrfs: use helper to cleanup tree roots) introduced the following bug,
    
     BUG: unable to handle kernel NULL pointer dereference at 0000000000000034
     IP: [<ffffffffa039368c>] extent_buffer_get+0x4/0xa [btrfs]
    [...]
     Pid: 2463, comm: btrfs-cache-1 Tainted: G           O 3.9.0+ #4 innotek GmbH VirtualBox/VirtualBox
     RIP: 0010:[<ffffffffa039368c>]  [<ffffffffa039368c>] extent_buffer_get+0x4/0xa [btrfs]
     Process btrfs-cache-1 (pid: 2463, threadinfo ffff880112d60000, task ffff880117679730)
    [...]
     Call Trace:
      [<ffffffffa0398a99>] btrfs_search_slot+0x104/0x64d [btrfs]
      [<ffffffffa039aea4>] btrfs_next_old_leaf+0xa7/0x334 [btrfs]
      [<ffffffffa039b141>] btrfs_next_leaf+0x10/0x12 [btrfs]
      [<ffffffffa039ea13>] caching_thread+0x1a3/0x2e0 [btrfs]
      [<ffffffffa03d8811>] worker_loop+0x14b/0x48e [btrfs]
      [<ffffffffa03d86c6>] ? btrfs_queue_worker+0x25c/0x25c [btrfs]
      [<ffffffff81068d3d>] kthread+0x8d/0x95
      [<ffffffff81068cb0>] ? kthread_freezable_should_stop+0x43/0x43
      [<ffffffff8151e5ac>] ret_from_fork+0x7c/0xb0
      [<ffffffff81068cb0>] ? kthread_freezable_should_stop+0x43/0x43
    RIP  [<ffffffffa039368c>] extent_buffer_get+0x4/0xa [btrfs]
    
    We've free'ed commit_root before actually getting to free block groups where
    caching thread needs valid extent_root->commit_root.
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
    2932505a
disk-io.c 108 KB