Fixed potential clobbering of packets of different types using SDL_HIDAPI_SendRumble()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c
index 52326a9..63d720d 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps4.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps4.c
@@ -615,7 +615,9 @@ HIDAPI_DriverPS4_TickleBluetooth(SDL_HIDAPI_Device *device)
data[0] = k_EPS4ReportIdBluetoothEffects;
data[1] = 0xC0; /* Magic value HID + CRC */
- SDL_HIDAPI_SendRumble(device, data, sizeof(data));
+ if (SDL_HIDAPI_LockRumble() == 0) {
+ SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data));
+ }
}
static void
diff --git a/src/joystick/hidapi/SDL_hidapi_ps5.c b/src/joystick/hidapi/SDL_hidapi_ps5.c
index 4b2255d..7458ada 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps5.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps5.c
@@ -746,7 +746,9 @@ HIDAPI_DriverPS5_TickleBluetooth(SDL_HIDAPI_Device *device)
data[0] = k_EPS5ReportIdBluetoothEffects;
data[1] = 0x02; /* Magic value */
- SDL_HIDAPI_SendRumble(device, data, sizeof(data));
+ if (SDL_HIDAPI_LockRumble() == 0) {
+ SDL_HIDAPI_SendRumbleAndUnlock(device, data, sizeof(data));
+ }
}
static void
diff --git a/src/joystick/hidapi/SDL_hidapi_rumble.c b/src/joystick/hidapi/SDL_hidapi_rumble.c
index 9cbdb95..9e4571f 100644
--- a/src/joystick/hidapi/SDL_hidapi_rumble.c
+++ b/src/joystick/hidapi/SDL_hidapi_rumble.c
@@ -240,19 +240,18 @@ int SDL_HIDAPI_SendRumble(SDL_HIDAPI_Device *device, const Uint8 *data, int size
int *pending_size;
int maximum_size;
+ if (size <= 0) {
+ return SDL_SetError("Tried to send rumble with invalid size");
+ }
+
if (SDL_HIDAPI_LockRumble() < 0) {
return -1;
}
/* check if there is a pending request for the device and update it */
- if (SDL_HIDAPI_GetPendingRumbleLocked(device, &pending_data, &pending_size, &maximum_size)) {
- if (size > maximum_size) {
- SDL_HIDAPI_UnlockRumble();
- return SDL_SetError("Couldn't send rumble, size %d is greater than %d", size, maximum_size);
- }
-
+ if (SDL_HIDAPI_GetPendingRumbleLocked(device, &pending_data, &pending_size, &maximum_size) &&
+ size == *pending_size && data[0] == pending_data[0]) {
SDL_memcpy(pending_data, data, size);
- *pending_size = size;
SDL_HIDAPI_UnlockRumble();
return size;
}