• Rasmus Villemoes's avatar
    genirq: Fix type of shifting literal 1 in __setup_irq() · ffc661c9
    Rasmus Villemoes authored
    If ffz() ever returns a value >= 31 then the following shift is undefined
    behaviour because the literal 1 which gets shifted is treated as signed
    integer.
    
    In practice, the bug is probably harmless, since the first undefined shift
    count is 31 which results - ignoring UB - in (int)(0x80000000). This gets
    sign extended so bit 32-63 will be set as well and all subsequent
    __setup_irq() calls would just end up hitting the -EBUSY branch.
    
    However, a sufficiently aggressive optimizer may use the UB of 1<<31
    to decide that doesn't happen, and hence elide the sign-extension
    code, so that subsequent calls can indeed get ffz > 31.
    
    In any case, the right thing to do is to make the literal 1UL.
    
    [ tglx: For this to happen a single interrupt would have to be shared by 32
      	devices. Hardware like that does not exist and would have way more
      	problems than that. ]
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/20171030213548.16831-1-linux@rasmusvillemoes.dk
    ffc661c9
manage.c 56.9 KB