From 410baa467ee9b5c96ac3ae2bc0bd82db13b8cbf9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 18 Oct 2009 16:14:35 +0000 Subject: [PATCH] Fixed bug #853 Ludwig Nussel 2009-10-18 05:34:18 PDT src/joystick/linux/SDL_sysjoystick.c has some problems: - test_bit() might break with strict aliasing - test_bit() assumes array is Uint32 but its actually "unsigned long" on 64bit systems sizeof(long) != sizeof(Uint32). - the keybit array is too small - the arrays are unitialized so the number of detected buttons is quite random --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404108 --- src/joystick/linux/SDL_sysjoystick.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index 39e76098f..8c9555cae 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -366,14 +366,15 @@ LogicalSuffix(int logicalno, char *namebuf, int len) #if SDL_INPUT_LINUXEV #define test_bit(nr, addr) \ - (((1UL << ((nr) & 31)) & (((const Uint32 *) addr)[(nr) >> 5])) != 0) + (((1UL << ((nr) % (sizeof(long) * 8))) & ((addr)[(nr) / (sizeof(long) * 8)])) != 0) +#define NBITS(x) ((((x)-1)/(sizeof(long) * 8))+1) static int EV_IsJoystick(int fd) { - unsigned long evbit[40]; - unsigned long keybit[40]; - unsigned long absbit[40]; + unsigned long evbit[NBITS(EV_MAX)] = { 0 }; + unsigned long keybit[NBITS(KEY_MAX)] = { 0 }; + unsigned long absbit[NBITS(ABS_MAX)] = { 0 }; if ((ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) || (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) || @@ -664,9 +665,9 @@ static SDL_bool EV_ConfigJoystick(SDL_Joystick * joystick, int fd) { int i, t; - unsigned long keybit[40]; - unsigned long absbit[40]; - unsigned long relbit[40]; + unsigned long keybit[NBITS(KEY_MAX)] = { 0 }; + unsigned long absbit[NBITS(ABS_MAX)] = { 0 }; + unsigned long relbit[NBITS(REL_MAX)] = { 0 }; /* See if this device uses the new unified event API */ if ((ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) >= 0) &&