From ce50bff418e87b55b281bfa2c5200efc4fc9ec22 Mon Sep 17 00:00:00 2001 From: Andreas Schiffler Date: Sun, 13 Jan 2013 22:55:26 -0800 Subject: [PATCH] Add input validation to SDL_GetKeyFromScancode; fix compiler warning in testautomation driver on Linux; update keyboard test suite --- src/events/SDL_keyboard.c | 5 ++++ test/testautomation.c | 2 +- test/testautomation_keyboard.c | 44 +++++++++++++++++++++++++++++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index 2a71a8050..df32f8c1f 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -860,6 +860,11 @@ SDL_Keycode SDL_GetKeyFromScancode(SDL_Scancode scancode) { SDL_Keyboard *keyboard = &SDL_keyboard; + + if (scancode= SDL_NUM_SCANCODES) { + SDL_InvalidParamError("scancode"); + return 0; + } return keyboard->keymap[scancode]; } diff --git a/test/testautomation.c b/test/testautomation.c index cfa384987..25165edb0 100644 --- a/test/testautomation.c +++ b/test/testautomation.c @@ -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; } } diff --git a/test/testautomation_keyboard.c b/test/testautomation_keyboard.c index 61f412648..588b1c235 100644 --- a/test/testautomation_keyboard.c +++ b/test/testautomation_keyboard.c @@ -4,6 +4,7 @@ #include +#include "SDL_config.h" #include "SDL.h" #include "SDL_test.h" @@ -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 */ @@ -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; } @@ -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"); @@ -401,6 +438,7 @@ keyboard_setTextInputRectNegative(void *arg) SDL_ClearError(); SDLTest_AssertPass("Call to SDL_ClearError()"); +#endif return TEST_COMPLETED; }