Fixed random behavior occurring due to passing 0xFFFF into SDL_GameControllerGetButton. May have shown up as unexpected button presses, or something far worse like a segfault. Source comments explain a little better.

This commit is contained in:
mcfarlandjb 2014-02-17 02:57:21 +00:00
parent bb27c041ea
commit 833649621a
1 changed files with 19 additions and 4 deletions

View File

@ -51,11 +51,26 @@ DTestButtonGC(ButtConfig *bc)
for(x = 0; x < bc->NumC; x++)
{
gc = s_GameCtrls[bc->DeviceNum[x]];
if( SDL_GameControllerGetButton(gc, (SDL_GameControllerButton) bc->ButtonNum[x]) )
/***
* ButtConfig->ButtonNum is a uint16. SDL_CONTROLLER_BUTTON_INVALID,
* used to mark unused button mappings (since 0 is a valid btn too), is
* defined as -1, but this turns into 0xFFFF, which doesn't cast back to
* SDL_GameControllerButton type.
*
* Without bounds-checking, if 0xFFFF is passed into GetButton, it results
* in random behavior since GetButton lacks internal bounds checking. The
* "fun" symptom that lead to discovery of this issue was that "select"
* would also press the turbo A and turbo B buttons.
*/
if( bc->ButtonNum[x] < SDL_CONTROLLER_BUTTON_MAX )
{
//printf("GC %d btn '%s'=down\n", bc->DeviceNum[x],
// SDL_GameControllerGetStringForButton( (SDL_GameControllerButton) bc->ButtonNum[x]));
return 1;
/** Check to see if this button is depressed */
if( SDL_GameControllerGetButton(gc, (SDL_GameControllerButton) bc->ButtonNum[x]) )
{
//printf("GC %d btn '%s'=down\n", bc->DeviceNum[x],
// SDL_GameControllerGetStringForButton( (SDL_GameControllerButton) bc->ButtonNum[x]));
return 1;
}
}
}
return 0;