• Eric W. Biederman's avatar
    ucounts: Fix signal ucount refcounting · 15bc01ef
    Eric W. Biederman authored
    In commit fda31c50 ("signal: avoid double atomic counter
    increments for user accounting") Linus made a clever optimization to
    how rlimits and the struct user_struct.  Unfortunately that
    optimization does not work in the obvious way when moved to nested
    rlimits.  The problem is that the last decrement of the per user
    namespace per user sigpending counter might also be the last decrement
    of the sigpending counter in the parent user namespace as well.  Which
    means that simply freeing the leaf ucount in __free_sigqueue is not
    enough.
    
    Maintain the optimization and handle the tricky cases by introducing
    inc_rlimit_get_ucounts and dec_rlimit_put_ucounts.
    
    By moving the entire optimization into functions that perform all of
    the work it becomes possible to ensure that every level is handled
    properly.
    
    The new function inc_rlimit_get_ucounts returns 0 on failure to
    increment the ucount.  This is different than inc_rlimit_ucounts which
    increments the ucounts and returns LONG_MAX if the ucount counter has
    exceeded it's maximum or it wrapped (to indicate the counter needs to
    decremented).
    
    I wish we had a single user to account all pending signals to across
    all of the threads of a process so this complexity was not necessary
    
    Cc: stable@vger.kernel.org
    Fixes: d6469690 ("Reimplement RLIMIT_SIGPENDING on top of ucounts")
    v1: https://lkml.kernel.org/r/87mtnavszx.fsf_-_@disp2133
    Link: https://lkml.kernel.org/r/87fssytizw.fsf_-_@disp2133Reviewed-by: default avatarAlexey Gladkov <legion@kernel.org>
    Tested-by: default avatarRune Kleveland <rune.kleveland@infomedia.dk>
    Tested-by: default avatarYu Zhao <yuzhao@google.com>
    Tested-by: default avatarJordan Glover <Golden_Miller83@protonmail.ch>
    Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    15bc01ef
ucount.c 8.82 KB