WINTERMUTE: Check keyboard state array index

vKeyToKeyCode() method was unsafe if vkey >= KEYSTATES_ARRAY_SIZE was
provided, fixed
This commit is contained in:
lolbot-iichan 2018-08-17 00:19:20 +03:00 committed by Tobia Tesan
parent 52b4206771
commit e97b1e560d

View file

@ -32,6 +32,8 @@
#include "common/system.h" #include "common/system.h"
#include "common/keyboard.h" #include "common/keyboard.h"
#define KEYSTATES_ARRAY_SIZE (Common::KEYCODE_UNDO + 1) // Hardcoded size for the common/keyboard.h enum
namespace Wintermute { namespace Wintermute {
IMPLEMENT_PERSISTENT(BaseKeyboardState, false) IMPLEMENT_PERSISTENT(BaseKeyboardState, false)
@ -46,8 +48,8 @@ BaseKeyboardState::BaseKeyboardState(BaseGame *inGame) : BaseScriptable(inGame)
_currentAlt = false; _currentAlt = false;
_currentControl = false; _currentControl = false;
_keyStates = new uint8[323]; // Hardcoded size for the common/keyboard.h enum _keyStates = new uint8[KEYSTATES_ARRAY_SIZE];
for (int i = 0; i < 323; i++) { for (int i = 0; i < KEYSTATES_ARRAY_SIZE; i++) {
_keyStates[i] = false; _keyStates[i] = false;
} }
} }
@ -499,7 +501,7 @@ Common::KeyCode BaseKeyboardState::vKeyToKeyCode(uint32 vkey) {
return Common::KEYCODE_SCROLLOCK; return Common::KEYCODE_SCROLLOCK;
default: default:
warning("Unknown VKEY: %d", vkey); warning("Unknown VKEY: %d", vkey);
return (Common::KeyCode)vkey; return (Common::KeyCode)(vkey < KEYSTATES_ARRAY_SIZE ? vkey : 0);
break; break;
} }