Skip to content
  • Oleg Nesterov's avatar
    kernel/acct.c: fix the acct->needcheck check in check_free_space() · 4d957015
    Oleg Nesterov authored
    As Tsukada explains, the time_is_before_jiffies(acct->needcheck) check
    is very wrong, we need time_is_after_jiffies() to make sys_acct() work.
    
    Ignoring the overflows, the code should "goto out" if needcheck >
    jiffies, while currently it checks "needcheck < jiffies" and thus in the
    likely case check_free_space() does nothing until jiffies overflow.
    
    In particular this means that sys_acct() is simply broken, acct_on()
    sets acct->needcheck = jiffies and expects that check_free_space()
    should set acct->active = 1 after the free-space check, but this won't
    happen if jiffies increments in between.
    
    This was broken by commit 32dc7308 ("get rid of timer in
    kern/acct.c") in 2011, then another (correct) commit 795a2f22
    ("acct() should honour the limits from the very beginning") made the
    problem more visible.
    
    Link: http://lkml.kernel.org/r/20171213133940.GA6554@redhat.com
    Fixes: 32dc7308 ("get rid of timer in kern/acct.c")
    Reported-by: ...
    4d957015