lkml.org 
[lkml]   [2018]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 169/254] kernel/acct.c: fix the acct->needcheck check in check_free_space()
    3.16.55-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Oleg Nesterov <oleg@redhat.com>

    commit 4d9570158b6260f449e317a5f9ed030c2504a615 upstream.

    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 32dc73086015 ("get rid of timer in
    kern/acct.c") in 2011, then another (correct) commit 795a2f22a8ea
    ("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: 32dc73086015 ("get rid of timer in kern/acct.c")
    Reported-by: TSUKADA Koutaro <tsukada@ascade.co.jp>
    Suggested-by: TSUKADA Koutaro <tsukada@ascade.co.jp>
    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    kernel/acct.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/kernel/acct.c
    +++ b/kernel/acct.c
    @@ -107,7 +107,7 @@ static int check_free_space(struct bsd_a

    spin_lock(&acct_lock);
    res = acct->active;
    - if (!file || time_is_before_jiffies(acct->needcheck))
    + if (!file || time_is_after_jiffies(acct->needcheck))
    goto out;
    spin_unlock(&acct_lock);

    \
     
     \ /
      Last update: 2018-02-28 17:01    [W:4.107 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site