cgroup: fix use-after-free when umounting cgroupfs
PATCH 1/1 cgroup: fix use-after-free when umounting cgroupfs
Try:
# mount -t cgroup xxx /cgroup # mkdir /cgroup/sub && rmdir /cgroup/sub && umount /cgroup
And you might see this:
ida_remove called for id=1 which is not allocated.
It's because cgroup_kill_sb() is called to destroy root->cgroup_ida and free cgrp->root before ida_simple_removed() is called. What's worse is we're accessing cgrp->root while it has been freed.
Signed-off-by Li Zefan <[email protected]>
--- kernel/cgroup.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/cgroup.c +4 -2
@@ -845,9 +845,12 @@ static void cgroup_free_fn(struct work_struct *work)*/ dput (cgrp->parent->dentry); +ida_simple_remove (&cgrp->root->cgroup_ida, cgrp->id); +/* * Drop the active superblock reference that we took when we -* created the cgroup +* created the cgroup. This will free cgrp->root, if we are +* holding the last reference to @sb. */ deactivate_super (cgrp->root->sb);
@@ -859,7 +862,6 @@ static void cgroup_free_fn(struct work_struct *work)simple_xattrs_free (&cgrp->xattrs); -ida_simple_remove (&cgrp->root->cgroup_ida, cgrp->id);kfree (rcu_dereference_raw (cgrp->name));kfree (cgrp); }
Signature · 1 line
1.8.0.2
Quoted 6 lines · Li Zefan
Try:
# mount -t cgroup xxx /cgroup # mkdir /cgroup/sub && rmdir /cgroup/sub && umount /cgroupAnd you might see this:
Quoted 7 lines
ida_removecalled for id=1 which is not allocated.It's because
cgroup_kill_sb()is called to destroyroot->cgroup_idaand freecgrp->rootbeforeida_simple_removed()is called. What's worse is we're accessingcgrp->rootwhile it has been freed.Signed-off-by Li Zefan <[email protected]>
Applied to cgroup/for-3.10.
Thanks.
Signature · 1 line
tejun