On Thu, Oct 31, 2024 at 04:56:01AM +0000, Andrei Vagin wrote: > The inc_rlimit_get_ucounts() increments the specified rlimit counter and > then checks its limit. If the value exceeds the limit, the function > returns an error without decrementing the counter. > > Fixes: 15bc01effefe ("ucounts: Fix signal ucount refcounting") > Tested-by: Roman Gushchin <roman.gushchin@xxxxxxxxx> > Co-debugged-by: Roman Gushchin <roman.gushchin@xxxxxxxxx> > Cc: Kees Cook <kees@xxxxxxxxxx> > Cc: Andrei Vagin <avagin@xxxxxxxxxx> > Cc: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> > Cc: Alexey Gladkov <legion@xxxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Andrei Vagin <avagin@xxxxxxxxxx> > --- > kernel/ucount.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/kernel/ucount.c b/kernel/ucount.c > index 8c07714ff27d..16c0ea1cb432 100644 > --- a/kernel/ucount.c > +++ b/kernel/ucount.c > @@ -328,13 +328,12 @@ long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type) > if (new != 1) > continue; > if (!get_ucounts(iter)) > - goto dec_unwind; > + goto unwind; > } > return ret; > -dec_unwind: > +unwind: > dec = atomic_long_sub_return(1, &iter->rlimit[type]); > WARN_ON_ONCE(dec < 0); > -unwind: > do_dec_rlimit_put_ucounts(ucounts, iter, type); > return 0; > } Agree. The do_dec_rlimit_put_ucounts() decreases rlimit up to iter but does not include it. Except for a small NAK because the patch changes goto for get_ucounts() and not for rlimit overflow check. Acked-by: Alexey Gladkov <legion@xxxxxxxxxx> -- Rgrds, legion