Add input validation to SDL_GetKeyFromScancode; fix compiler warning in testautomation driver on Linux; update keyboard test suite
authorAndreas Schiffler <aschiffler@ferzkopp.net>
Sun, 13 Jan 2013 22:55:26 -0800
changeset 6813 b21879e67db2
parent 6812 1f92a4ad24e7
child 6814 fccdef204fcf
Add input validation to SDL_GetKeyFromScancode; fix compiler warning in testautomation driver on Linux; update keyboard test suite
src/events/SDL_keyboard.c
test/testautomation.c
test/testautomation_keyboard.c
--- 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;
 }