Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Add input validation to SDL_GetKeyFromScancode; fix compiler warning …
Browse files Browse the repository at this point in the history
…in testautomation driver on Linux; update keyboard test suite
  • Loading branch information
ferzkopp committed Jan 14, 2013
1 parent dc6a865 commit ce50bff
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
5 changes: 5 additions & 0 deletions src/events/SDL_keyboard.c
Expand Up @@ -860,6 +860,11 @@ SDL_Keycode
SDL_GetKeyFromScancode(SDL_Scancode scancode)
{
SDL_Keyboard *keyboard = &SDL_keyboard;

if (scancode<SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) {
SDL_InvalidParamError("scancode");
return 0;
}

return keyboard->keymap[scancode];
}
Expand Down
2 changes: 1 addition & 1 deletion test/testautomation.c
Expand Up @@ -61,7 +61,7 @@ main(int argc, char *argv[])
}
else if (SDL_strcasecmp(argv[i], "--execKey") == 0) {
if (argv[i + 1]) {
SDL_sscanf(argv[i + 1], "%llu", &userExecKey);
SDL_sscanf(argv[i + 1], "%llu", (long long unsigned int *)&userExecKey);
consumed = 2;
}
}
Expand Down
44 changes: 41 additions & 3 deletions test/testautomation_keyboard.c
Expand Up @@ -4,6 +4,7 @@

#include <stdio.h>

#include "SDL_config.h"
#include "SDL.h"
#include "SDL_test.h"

Expand Down Expand Up @@ -110,6 +111,8 @@ keyboard_getKeyFromName(void *arg)
int
keyboard_getKeyFromScancode(void *arg)
{
const char *expectedError = "Parameter 'scancode' is invalid";
const char *error;
SDL_Keycode result;

/* Case where input is valid */
Expand All @@ -119,13 +122,41 @@ keyboard_getKeyFromScancode(void *arg)

/* Case where input is zero */
result = SDL_GetKeyFromScancode(0);
SDLTest_AssertPass("Call to SDL_GetKeyFromScancode(zero)");
SDLTest_AssertPass("Call to SDL_GetKeyFromScancode(0)");
SDLTest_AssertCheck(result == SDLK_UNKNOWN, "Verify result from call is UNKNOWN, expected: %i, got: %i", SDLK_UNKNOWN, result);

/* Case where input is invalid */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");

/* Case where input is invalid (too small) */
result = SDL_GetKeyFromScancode(-999);
SDLTest_AssertPass("Call to SDL_GetKeyFromScancode(invalid)");
SDLTest_AssertPass("Call to SDL_GetKeyFromScancode(-999)");
SDLTest_AssertCheck(result == SDLK_UNKNOWN, "Verify result from call is UNKNOWN, expected: %i, got: %i", SDLK_UNKNOWN, result);
error = SDL_GetError();
SDLTest_AssertPass("Call to SDL_GetError()");
SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");
if (error != NULL) {
SDLTest_AssertCheck(SDL_strcmp(error, expectedError) == 0,
"Validate error message, expected: '%s', got: '%s'", expectedError, error);
}

SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");

/* Case where input is invalid (too big) */
result = SDL_GetKeyFromScancode(999);
SDLTest_AssertPass("Call to SDL_GetKeyFromScancode(999)");
SDLTest_AssertCheck(result == SDLK_UNKNOWN, "Verify result from call is UNKNOWN, expected: %i, got: %i", SDLK_UNKNOWN, result);
error = SDL_GetError();
SDLTest_AssertPass("Call to SDL_GetError()");
SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");
if (error != NULL) {
SDLTest_AssertCheck(SDL_strcmp(error, expectedError) == 0,
"Validate error message, expected: '%s', got: '%s'", expectedError, error);
}

SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");

return TEST_COMPLETED;
}
Expand Down Expand Up @@ -382,15 +413,21 @@ keyboard_setTextInputRect(void *arg)
int
keyboard_setTextInputRectNegative(void *arg)
{
/* Some platforms set also an error message; prepare for checking it */
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_COCOA
const char *expectedError = "Parameter 'rect' is invalid";
const char *error;

SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
#endif

/* NULL refRect */
SDL_SetTextInputRect(NULL);
SDLTest_AssertPass("Call to SDL_SetTextInputRect(NULL)");

/* Some platforms set also an error message; so check it */
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_COCOA
error = SDL_GetError();
SDLTest_AssertPass("Call to SDL_GetError()");
SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");
Expand All @@ -401,6 +438,7 @@ keyboard_setTextInputRectNegative(void *arg)

SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
#endif

return TEST_COMPLETED;
}
Expand Down

0 comments on commit ce50bff

Please sign in to comment.