diff options
author | Joel Teichroeb | 2013-10-27 13:04:18 -0700 |
---|---|---|
committer | D G Turner | 2013-11-14 15:23:01 +0000 |
commit | 51dceaf1659ecc8ef3371f3a2fa26ca137403447 (patch) | |
tree | 11e40f1443ac56a2c38db817091c2dbfb0dcf9bb | |
parent | 0ccc9189402de806307ca9836196cf29f31b2ab7 (diff) | |
download | scummvm-rg350-51dceaf1659ecc8ef3371f3a2fa26ca137403447.tar.gz scummvm-rg350-51dceaf1659ecc8ef3371f3a2fa26ca137403447.tar.bz2 scummvm-rg350-51dceaf1659ecc8ef3371f3a2fa26ca137403447.zip |
GUI: Use Common::String for console history, to ensure buffer safety.
Previously, if the user enters a command that is more than 256
characters, it will overflow the history buffer.
By using a Common::String, this is not possible.
-rw-r--r-- | gui/console.cpp | 23 | ||||
-rw-r--r-- | gui/console.h | 6 |
2 files changed, 11 insertions, 18 deletions
diff --git a/gui/console.cpp b/gui/console.cpp index 49e2fccd98..7e88b6dfb5 100644 --- a/gui/console.cpp +++ b/gui/console.cpp @@ -82,8 +82,6 @@ ConsoleDialog::ConsoleDialog(float widthPercent, float heightPercent) _historyIndex = 0; _historyLine = 0; _historySize = 0; - for (int i = 0; i < kHistorySize; i++) - _history[i][0] = '\0'; // Display greetings & prompt print(gScummVMFullVersion); @@ -274,24 +272,19 @@ void ConsoleDialog::handleKeyDown(Common::KeyState state) { if (len > 0) { - // We have to allocate the string buffer with new, since VC++ sadly does not - // comply to the C++ standard, so we can't use a dynamic sized stack array. - char *str = new char[len + 1]; + Common::String str; // Copy the user input to str for (i = 0; i < len; i++) - str[i] = buffer(_promptStartPos + i); - str[len] = '\0'; + str.insertChar(buffer(_promptStartPos + i), i); // Add the input to the history addToHistory(str); // Pass it to the input callback, if any if (_callbackProc) - keepRunning = (*_callbackProc)(this, str, _callbackRefCon); + keepRunning = (*_callbackProc)(this, str.c_str(), _callbackRefCon); - // Get rid of the string buffer - delete[] str; } print(PROMPT); @@ -575,8 +568,8 @@ void ConsoleDialog::killLastWord() { } } -void ConsoleDialog::addToHistory(const char *str) { - strcpy(_history[_historyIndex], str); +void ConsoleDialog::addToHistory(const Common::String &str) { + _history[_historyIndex] = str; _historyIndex = (_historyIndex + 1) % kHistorySize; _historyLine = 0; if (_historySize < kHistorySize) @@ -590,8 +583,7 @@ void ConsoleDialog::historyScroll(int direction) { if (_historyLine == 0 && direction > 0) { int i; for (i = 0; i < _promptEndPos - _promptStartPos; i++) - _history[_historyIndex][i] = buffer(_promptStartPos + i); - _history[_historyIndex][i] = '\0'; + _history[_historyIndex].insertChar(buffer(_promptStartPos + i), i); } // Advance to the next line in the history @@ -617,7 +609,8 @@ void ConsoleDialog::historyScroll(int direction) { idx = (_historyIndex - _historyLine + _historySize) % _historySize; else idx = _historyIndex; - for (int i = 0; i < kLineBufferSize && _history[idx][i] != '\0'; i++) + int length = _history[idx].size(); + for (int i = 0; i < length; i++) printCharIntern(_history[idx][i]); _promptEndPos = _currentPos; diff --git a/gui/console.h b/gui/console.h index 50a00a1ad1..194bfd6fc0 100644 --- a/gui/console.h +++ b/gui/console.h @@ -23,6 +23,7 @@ #define CONSOLE_DIALOG_H #include "gui/dialog.h" +#include "common/str.h" namespace GUI { @@ -69,7 +70,6 @@ protected: enum { kBufferSize = 32768, kCharsPerLine = 128, - kLineBufferSize = 256, kHistorySize = 20 }; @@ -112,7 +112,7 @@ protected: CompletionCallbackProc _completionCallbackProc; void *_completionCallbackRefCon; - char _history[kHistorySize][kLineBufferSize]; + Common::String _history[kHistorySize]; int _historySize; int _historyIndex; int _historyLine; @@ -184,7 +184,7 @@ protected: void killLastWord(); // History - void addToHistory(const char *str); + void addToHistory(const Common::String &str); void historyScroll(int direction); }; |