From 982f8a83ec71c8a98ed87f1d4c71c6d38459ee9a Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 22 Dec 2019 13:56:50 -0800 Subject: [PATCH] Fixed bug 4910 - Missing joystick-driver type check in haptic meyraud705 On Linux and MacOS, some haptic system functions access joystick->hw_data without checking the driver type. --- src/haptic/darwin/SDL_syshaptic.c | 11 ++++++++++- src/haptic/linux/SDL_syshaptic.c | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/haptic/darwin/SDL_syshaptic.c b/src/haptic/darwin/SDL_syshaptic.c index 65708cdba..650a5e851 100644 --- a/src/haptic/darwin/SDL_syshaptic.c +++ b/src/haptic/darwin/SDL_syshaptic.c @@ -599,6 +599,9 @@ SDL_SYS_HapticMouse(void) int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick) { + if (joystick->driver != &SDL_DARWIN_JoystickDriver) { + return SDL_FALSE; + } if (joystick->hwdata->ffservice != 0) { return SDL_TRUE; } @@ -612,6 +615,9 @@ SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick) int SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick) { + if (joystick->driver != &SDL_DARWIN_JoystickDriver) { + return 0; + } if (IOObjectIsEqualTo((io_object_t) ((size_t)haptic->hwdata->device), joystick->hwdata->ffservice)) { return 1; @@ -628,7 +634,10 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick) { int device_index = 0; SDL_hapticlist_item *item; - + + if (joystick->driver != &SDL_DARWIN_JoystickDriver) { + return -1; + } for (item = SDL_hapticlist; item; item = item->next) { if (IOObjectIsEqualTo((io_object_t) item->dev, joystick->hwdata->ffservice)) { diff --git a/src/haptic/linux/SDL_syshaptic.c b/src/haptic/linux/SDL_syshaptic.c index 1924bf4d5..3a103230b 100644 --- a/src/haptic/linux/SDL_syshaptic.c +++ b/src/haptic/linux/SDL_syshaptic.c @@ -512,6 +512,9 @@ SDL_SYS_HapticMouse(void) int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick) { + if (joystick->driver != &SDL_LINUX_JoystickDriver) { + return 0; + } return EV_IsHaptic(joystick->hwdata->fd); } @@ -522,6 +525,9 @@ SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick) int SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick) { + if (joystick->driver != &SDL_LINUX_JoystickDriver) { + return 0; + } /* We are assuming Linux is using evdev which should trump the old * joystick methods. */ if (SDL_strcmp(joystick->hwdata->fname, haptic->hwdata->fname) == 0) { @@ -541,7 +547,10 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick) int fd; int ret; SDL_hapticlist_item *item; - + + if (joystick->driver != &SDL_LINUX_JoystickDriver) { + return -1; + } /* Find the joystick in the haptic list. */ for (item = SDL_hapticlist; item; item = item->next) { if (SDL_strcmp(item->fname, joystick->hwdata->fname) == 0) {