Add input validation to SDL_GetKeyFromScancode; fix compiler warning in testautomation driver on Linux; update keyboard test suite
--- a/src/events/SDL_keyboard.c Sun Jan 13 14:31:53 2013 -0800
+++ b/src/events/SDL_keyboard.c Sun Jan 13 22:55:26 2013 -0800
@@ -860,6 +860,11 @@
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];
}
--- a/test/testautomation.c Sun Jan 13 14:31:53 2013 -0800
+++ b/test/testautomation.c Sun Jan 13 22:55:26 2013 -0800
@@ -61,7 +61,7 @@
}
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;
}
}
--- a/test/testautomation_keyboard.c Sun Jan 13 14:31:53 2013 -0800
+++ b/test/testautomation_keyboard.c Sun Jan 13 22:55:26 2013 -0800
@@ -4,6 +4,7 @@
#include <stdio.h>
+#include "SDL_config.h"
#include "SDL.h"
#include "SDL_test.h"
@@ -110,6 +111,8 @@
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 @@
/* 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 @@
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 @@
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
+#endif
return TEST_COMPLETED;
}