Skip to content
  • Florian La Roche's avatar
    fix int_sqrt64() for very large numbers · fbfaf851
    Florian La Roche authored
    
    
    If an input number x for int_sqrt64() has the highest bit set, then
    fls64(x) is 64.  (1UL << 64) is an overflow and breaks the algorithm.
    
    Subtracting 1 is a better guess for the initial value of m anyway and
    that's what also done in int_sqrt() implicitly [*].
    
    [*] Note how int_sqrt() uses __fls() with two underscores, which already
        returns the proper raw bit number.
    
        In contrast, int_sqrt64() used fls64(), and that returns bit numbers
        illogically starting at 1, because of error handling for the "no
        bits set" case. Will points out that he bug probably is due to a
        copy-and-paste error from the regular int_sqrt() case.
    
    Signed-off-by: default avatarFlorian La Roche <Florian.LaRoche@googlemail.com>
    Acked-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fbfaf851