• H. Peter Anvin's avatar
    avoid overflows in kernel/time.c · bdc80787
    H. Peter Anvin authored
    When the conversion factor between jiffies and milli- or microseconds is
    not a single multiply or divide, as for the case of HZ == 300, we currently
    do a multiply followed by a divide.  The intervening result, however, is
    subject to overflows, especially since the fraction is not simplified (for
    HZ == 300, we multiply by 300 and divide by 1000).
    
    This is exposed to the user when passing a large timeout to poll(), for
    example.
    
    This patch replaces the multiply-divide with a reciprocal multiplication on
    32-bit platforms.  When the input is an unsigned long, there is no portable
    way to do this on 64-bit platforms there is no portable way to do this
    since it requires a 128-bit intermediate result (which gcc does support on
    64-bit platforms but may generate libgcc calls, e.g.  on 64-bit s390), but
    since the output is a 32-bit integer in the cases affected, just simplify
    the multiply-divide (*3/10 instead of *300/1000).
    
    The reciprocal multiply used can have off-by-one errors in...
    bdc80787
time.c 17.3 KB