mirror of
https://github.com/Ryujinx/SDL.git
synced 2024-12-24 03:15:31 +00:00
Fixed bug 4898 - No rumble because of integer overflow in SDL_JoystickRumble
meyraud705 On a Dualshock 4 controller using hidapi driver, calling SDL_JoystickRumble with a duration too long (SDL_HAPTIC_INFINITY for example) causes the rumble to stop immediately. This happens because of integer overflow on line 301 of SDL_hidapi_ps4.c (https://hg.libsdl.org/SDL/file/a3077169ad23/src/joystick/hidapi/SDL_hidapi_ps4.c#l301), which sets expiration time in the past.
This commit is contained in:
parent
4d4e5584ea
commit
a7ae9175c3
|
@ -298,7 +298,7 @@ HIDAPI_DriverPS4_Rumble(SDL_Joystick *joystick, hid_device *dev, void *context,
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
|
if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
|
||||||
ctx->rumble_expiration = SDL_GetTicks() + duration_ms;
|
ctx->rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
|
||||||
} else {
|
} else {
|
||||||
ctx->rumble_expiration = 0;
|
ctx->rumble_expiration = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,7 +381,7 @@ HIDAPI_DriverXbox360_Rumble(SDL_Joystick *joystick, hid_device *dev, void *conte
|
||||||
#endif /* __WIN32__ */
|
#endif /* __WIN32__ */
|
||||||
|
|
||||||
if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
|
if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
|
||||||
ctx->rumble_expiration = SDL_GetTicks() + duration_ms;
|
ctx->rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
|
||||||
} else {
|
} else {
|
||||||
ctx->rumble_expiration = 0;
|
ctx->rumble_expiration = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -298,7 +298,7 @@ HIDAPI_DriverXboxOne_Rumble(SDL_Joystick *joystick, hid_device *dev, void *conte
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
|
if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
|
||||||
ctx->rumble_expiration = SDL_GetTicks() + duration_ms;
|
ctx->rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
|
||||||
} else {
|
} else {
|
||||||
ctx->rumble_expiration = 0;
|
ctx->rumble_expiration = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,9 @@
|
||||||
#undef SDL_JOYSTICK_HIDAPI_XBOXONE
|
#undef SDL_JOYSTICK_HIDAPI_XBOXONE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Prevent rumble duration overflow */
|
||||||
|
#define SDL_MAX_RUMBLE_DURATION_MS 0x0fffffff
|
||||||
|
|
||||||
typedef struct _SDL_HIDAPI_DeviceDriver
|
typedef struct _SDL_HIDAPI_DeviceDriver
|
||||||
{
|
{
|
||||||
const char *hint;
|
const char *hint;
|
||||||
|
|
Loading…
Reference in a new issue