• Hans de Goede's avatar
    cgroup: Fix use after free of cgrp (cgrp->css_sets) · e72e9a22
    Hans de Goede authored
    
    
    Running a 3.4 kernel + Fedora-18 (systemd) userland on my Allwinner A10
    (arm cortex a8), I'm seeing repeated, reproducable list_del list corruption
    errors when build with CONFIG_DEBUG_LIST, and the backtrace always shows
    free_css_set_work as the function making the problematic list_del call.
    
    I've tracked this doen to a use after free of the cgrp struct, specifically
    of the cgrp->css_sets list_head, which gets cleared by free_css_set_work.
    
    Since free_css_set_work runs form a workqueue, it is possible for it to not be
    done with clearing the list when the cgrp gets free-ed. To avoid this the code
    adding the links increases cgrp->count, and the freeing code running from the
    workqueue decreases cgrp->count *after* doing list_del, and then if the count
    goes to 0 calls cgroup_wakeup_rmdir_waiter().
    
    However cgroup_rmdir() is missing a check for cgrp->count != 0, causing it
    to still continue with the rmdir (which leads to the free-ing of the cgrp),
    before free_css_set_work is done. Sometimes the free-ed memory is re-used
    before free_css_set_work gets around to unlinking link->cgrp_link_list,
    triggering the list_del list corruption messages.
    
    This patch fixes this by properly checking for cgrp->count != 0 and waiting
    for the cgroup_rmdir_waitq in that case.
    
    Change-Id: I9dbc02a0a75d5dffa1b65d67456e00139dea57c3
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    e72e9a22
cgroup.c 139 KB