• John Sperbeck's avatar
    cgroup: always put cset in cgroup_css_set_put_fork · 2bd11033
    John Sperbeck authored
    A successful call to cgroup_css_set_fork() will always have taken
    a ref on kargs->cset (regardless of CLONE_INTO_CGROUP), so always
    do a corresponding put in cgroup_css_set_put_fork().
    
    Without this, a cset and its contained css structures will be
    leaked for some fork failures.  The following script reproduces
    the leak for a fork failure due to exceeding pids.max in the
    pids controller.  A similar thing can happen if we jump to the
    bad_fork_cancel_cgroup label in copy_process().
    
    [ -z "$1" ] && echo "Usage $0 pids-root" && exit 1
    PID_ROOT=$1
    CGROUP=$PID_ROOT/foo
    
    [ -e $CGROUP ] && rmdir -f $CGROUP
    mkdir $CGROUP
    echo 5 > $CGROUP/pids.max
    echo $$ > $CGROUP/cgroup.procs
    
    fork_bomb()
    {
    	set -e
    	for i in $(seq 10); do
    		/bin/sleep 3600 &
    	done
    }
    
    (fork_bomb) &
    wait
    echo $$ > $PID_ROOT/cgroup.procs
    kill $(cat $CGROUP/cgroup.procs)
    rmdir $CGROUP
    
    Fixes: ef2c41cf ("clone3: allow spawning processes into cgroups")
    Cc: stable@vger.kernel.org # v5.7+
    Signed-off-by: default avatarJohn Sperbeck <jsperbeck@google.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    2bd11033
cgroup.c 184 KB