lkml.org 
[lkml]   [2020]   [Sep]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 152/330] timekeeping: Prevent 32bit truncation in scale64_check_overflow()
    Date
    From: Wen Yang <wenyang@linux.alibaba.com>

    [ Upstream commit 4cbbc3a0eeed675449b1a4d080008927121f3da3 ]

    While unlikely the divisor in scale64_check_overflow() could be >= 32bit in
    scale64_check_overflow(). do_div() truncates the divisor to 32bit at least
    on 32bit platforms.

    Use div64_u64() instead to avoid the truncation to 32-bit.

    [ tglx: Massaged changelog ]

    Signed-off-by: Wen Yang <wenyang@linux.alibaba.com>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20200120100523.45656-1-wenyang@linux.alibaba.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/time/timekeeping.c | 3 +--
    1 file changed, 1 insertion(+), 2 deletions(-)

    diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
    index ca69290bee2a3..4fc2af4367a7b 100644
    --- a/kernel/time/timekeeping.c
    +++ b/kernel/time/timekeeping.c
    @@ -1005,9 +1005,8 @@ static int scale64_check_overflow(u64 mult, u64 div, u64 *base)
    ((int)sizeof(u64)*8 - fls64(mult) < fls64(rem)))
    return -EOVERFLOW;
    tmp *= mult;
    - rem *= mult;

    - do_div(rem, div);
    + rem = div64_u64(rem * mult, div);
    *base = tmp + rem;
    return 0;
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-09-18 05:06    [W:4.233 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site