Skip to content

Commit

Permalink
Fixed potential clobbering of packets of different types using SDL_HI…
Browse files Browse the repository at this point in the history
…DAPI_SendRumble()
  • Loading branch information
slouken committed Nov 6, 2022
1 parent e45cb5b commit 38af459
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 9 deletions.
4 changes: 3 additions & 1 deletion src/joystick/hidapi/SDL_hidapi_ps4.c
Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion src/joystick/hidapi/SDL_hidapi_ps5.c
Expand Up @@ -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
Expand Down
13 changes: 6 additions & 7 deletions src/joystick/hidapi/SDL_hidapi_rumble.c
Expand Up @@ -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;
}
Expand Down

0 comments on commit 38af459

Please sign in to comment.