• Tejun Heo's avatar
    cgroup: fix cgroup_create() error handling path · 266ccd50
    Tejun Heo authored
    ae7f164a ("cgroup: move cgroup->subsys[] assignment to
    online_css()") moved cgroup->subsys[] assignements later in
    cgroup_create() but didn't update error handling path accordingly
    leading to the following oops and leaking later css's after an
    online_css() failure.  The oops is from cgroup destruction path being
    invoked on the partially constructed cgroup which is not ready to
    handle empty slots in cgrp->subsys[] array.
    
      BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
      IP: [<ffffffff810eeaa8>] cgroup_destroy_locked+0x118/0x2f0
      PGD a780a067 PUD aadbe067 PMD 0
      Oops: 0000 [#1] SMP
      Modules linked in:
      CPU: 6 PID: 7360 Comm: mkdir Not tainted 3.13.0-rc2+ #69
      Hardware name:
      task: ffff8800b9dbec00 ti: ffff8800a781a000 task.ti: ffff8800a781a000
      RIP: 0010:[<ffffffff810eeaa8>]  [<ffffffff810eeaa8>] cgroup_destroy_locked+0x118/0x2f0
      RSP: 0018:ffff8800a781bd98  EFLAGS: 00010282
      RAX: ffff880586903878 RBX: ffff880586903800 RCX: ffff880586903820
      RDX: ffff880586903860 RSI: ffff8800a781bdb0 RDI: ffff880586903820
      RBP: ffff8800a781bde8 R08: ffff88060e0b8048 R09: ffffffff811d7bc1
      R10: 000000000000008c R11: 0000000000000001 R12: ffff8800a72286c0
      R13: 0000000000000000 R14: ffffffff81cf7a40 R15: 0000000000000001
      FS:  00007f60ecda57a0(0000) GS:ffff8806272c0000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 0000000000000008 CR3: 00000000a7a03000 CR4: 00000000000007e0
      Stack:
       ffff880586903860 ffff880586903910 ffff8800a72286c0 ffff880586903820
       ffffffff81cf7a40 ffff880586903800 ffff88060e0b8018 ffffffff81cf7a40
       ffff8800b9dbec00 ffff8800b9dbf098 ffff8800a781bec8 ffffffff810ef5bf
      Call Trace:
       [<ffffffff810ef5bf>] cgroup_mkdir+0x55f/0x5f0
       [<ffffffff811c90ae>] vfs_mkdir+0xee/0x140
       [<ffffffff811cb07e>] SyS_mkdirat+0x6e/0xf0
       [<ffffffff811c6a19>] SyS_mkdir+0x19/0x20
       [<ffffffff8169e569>] system_call_fastpath+0x16/0x1b
    
    This patch moves reference bumping inside online_css() loop, clears
    css_ar[] as css's are brought online successfully, and updates
    err_destroy path so that either a css is fully online and destroyed by
    cgroup_destroy_locked() or the error path frees it.  This creates a
    duplicate css free logic in the error path but it will be cleaned up
    soon.
    
    v2: Li pointed out that cgroup_destroy_locked() would do NULL-deref if
        invoked with a cgroup which doesn't have all css's populated.
        Update cgroup_destroy_locked() so that it skips NULL css's.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarLi Zefan <lizefan@huawei.com>
    Reported-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Cc: stable@vger.kernel.org # v3.12+
    266ccd50
cgroup.c 153 KB