• Hans de Goede's avatar
    [PATCH] PATCH: 1 line 2.6.18 bugfix: modpost-64bit-fix.patch · e0e92632
    Hans de Goede authored
    There is a small but annoying bug in scripts/mod/file2alias.c which causes
    it to generate invalid aliases for input devices on 64 bit archs. This causes
    joydev.ko to not be automaticly loaded when inserting a joystick, resulting in
    a non working joystick (for the average user).
    
    In scripts/mod/file2alias.c is the following code for generating the input
    aliases:
    static void do_input(char *alias,
                         kernel_ulong_t *arr, unsigned int min, unsigned int max)
    {
            unsigned int i;
    
            for (i = min; i < max; i++)
                    if (arr[i / BITS_PER_LONG] & (1 << (i%BITS_PER_LONG)))
                            sprintf(alias + strlen(alias), "%X,*", i);
    }
    
    On 32 bits systems, this correctly generates "0,*" for the first alias, "8,*"
    for the second etc.
    
    However on 64 bits it generates: "0,*20,*" resp "8,*28,*" Notice how it adds 20
    + first entry (hex) ! to the list of hex codes, which is 32 more then the first
    entry, thus is because the bit test above wraps at 32 bits instead of 64.
    
    scripts/mod/file2alias.c, line 379 reads:
                    if (arr[i / BITS_PER_LONG] & (1 << (i%BITS_PER_LONG)))
    That should be:
                    if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG)))
    
    Notice the added 'L' after the 1, otherwise that is an 32 bit int instead of a
    64 bit long, and when that int gets shifted >= 32 times, appearantly the number
    by which to shift is wrapped at 5 bits ( % 32) causing it to test a bit 32 bits
    too low.
    
    The patch below makes the nescesarry 1 char change :)
    Signed-off-by: default avatarHans de Goede <j.w.r.degoede@hhs.nl>
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    e0e92632
file2alias.c 17.2 KB