diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp index 3767c47af60..db3c1d189d5 100644 --- a/engines/wintermute/ad/ad_game.cpp +++ b/engines/wintermute/ad/ad_game.cpp @@ -1559,10 +1559,9 @@ void AdGame::setPrevSceneName(const char *name) { delete[] _prevSceneName; _prevSceneName = nullptr; if (name) { - _prevSceneName = new char[strlen(name) + 1]; - if (_prevSceneName) { - strcpy(_prevSceneName, name); - } + size_t nameSize = strlen(name) + 1; + _prevSceneName = new char[nameSize]; + Common::strcpy_s(_prevSceneName, nameSize, name); } } @@ -1572,10 +1571,9 @@ void AdGame::setPrevSceneFilename(const char *name) { delete[] _prevSceneFilename; _prevSceneFilename = nullptr; if (name) { - _prevSceneFilename = new char[strlen(name) + 1]; - if (_prevSceneFilename) { - strcpy(_prevSceneFilename, name); - } + size_t nameSize = strlen(name) + 1; + _prevSceneFilename = new char[nameSize]; + Common::strcpy_s(_prevSceneFilename, nameSize, name); } } @@ -1588,8 +1586,9 @@ bool AdGame::scheduleChangeScene(const char *filename, bool fadeIn) { if (_scene && !_scene->_initialized) { return changeScene(filename, fadeIn); } else { - _scheduledScene = new char [strlen(filename) + 1]; - strcpy(_scheduledScene, filename); + size_t filenameSize = strlen(filename) + 1; + _scheduledScene = new char [filenameSize]; + Common::strcpy_s(_scheduledScene, filenameSize, filename); _scheduledFadeIn = fadeIn; @@ -1736,8 +1735,9 @@ bool AdGame::loadItemsFile(const char *filename, bool merge) { bool ret; - //_filename = new char [strlen(filename)+1]; - //strcpy(_filename, filename); + //size_t filenameSize = strlen(filename) + 1; + //_filename = new char [filenameSize]; + //Common::strcpy_s(_filename, filenameSize, filename); if (DID_FAIL(ret = loadItemsBuffer(buffer, merge))) { _gameRef->LOG(0, "Error parsing ITEMS file '%s'", filename); @@ -1807,8 +1807,9 @@ bool AdGame::loadItemsBuffer(char *buffer, bool merge) { ////////////////////////////////////////////////////////////////////////// AdSceneState *AdGame::getSceneState(const char *filename, bool saving) { - char *filenameCor = new char[strlen(filename) + 1]; - strcpy(filenameCor, filename); + size_t filenameSize = strlen(filename) + 1; + char *filenameCor = new char[filenameSize]; + Common::strcpy_s(filenameCor, filenameSize, filename); for (uint32 i = 0; i < strlen(filenameCor); i++) { if (filenameCor[i] == '/') { filenameCor[i] = '\\'; @@ -2274,10 +2275,11 @@ bool AdGame::addSpeechDir(const char *dir) { return STATUS_FAILED; } - char *temp = new char[strlen(dir) + 2]; - strcpy(temp, dir); - if (temp[strlen(temp) - 1] != '\\' && temp[strlen(temp) - 1] != '/') { - strcat(temp, "\\"); + size_t dirSize = strlen(dir) + 2; + char *temp = new char[dirSize]; + Common::strcpy_s(temp, dirSize, dir); + if (temp[dirSize - 2 - 1] != '\\' && temp[dirSize - 2 - 1] != '/') { + Common::strcat_s(temp, dirSize, "\\"); } for (uint32 i = 0; i < _speechDirs.size(); i++) { @@ -2298,10 +2300,11 @@ bool AdGame::removeSpeechDir(const char *dir) { return STATUS_FAILED; } - char *temp = new char[strlen(dir) + 2]; - strcpy(temp, dir); - if (temp[strlen(temp) - 1] != '\\' && temp[strlen(temp) - 1] != '/') { - strcat(temp, "\\"); + size_t dirSize = strlen(dir) + 2; + char *temp = new char[dirSize]; + Common::strcpy_s(temp, dirSize, dir); + if (temp[dirSize - 2 - 1] != '\\' && temp[dirSize - 2 - 1] != '/') { + Common::strcat_s(temp, dirSize, "\\"); } bool found = false; diff --git a/engines/wintermute/ad/ad_node_state.cpp b/engines/wintermute/ad/ad_node_state.cpp index 2ebe79bea2e..6c1cba36f5e 100644 --- a/engines/wintermute/ad/ad_node_state.cpp +++ b/engines/wintermute/ad/ad_node_state.cpp @@ -118,11 +118,10 @@ void AdNodeState::setCaption(const char *caption, int caseVal) { } delete[] _caption[caseVal - 1]; - _caption[caseVal - 1] = new char[strlen(caption) + 1]; - if (_caption[caseVal - 1]) { - strcpy(_caption[caseVal - 1], caption); - _gameRef->expandStringByStringTable(&_caption[caseVal - 1]); - } + size_t captionSize = strlen(caption) + 1; + _caption[caseVal - 1] = new char[captionSize]; + Common::strcpy_s(_caption[caseVal - 1], captionSize, caption); + _gameRef->expandStringByStringTable(&_caption[caseVal - 1]); } diff --git a/engines/wintermute/ad/ad_object.cpp b/engines/wintermute/ad/ad_object.cpp index cf7557f6da3..bc860f14070 100644 --- a/engines/wintermute/ad/ad_object.cpp +++ b/engines/wintermute/ad/ad_object.cpp @@ -254,8 +254,9 @@ bool AdObject::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack stack->correctParams(1); const char *animName = stack->pop()->getString(); delete[] _forcedTalkAnimName; - _forcedTalkAnimName = new char[strlen(animName) + 1]; - strcpy(_forcedTalkAnimName, animName); + size_t animNameSize = strlen(animName) + 1; + _forcedTalkAnimName = new char[animNameSize]; + Common::strcpy_s(_forcedTalkAnimName, animNameSize, animName); _forcedTalkAnimUsed = false; stack->pushBool(true); return STATUS_OK; diff --git a/engines/wintermute/ad/ad_response_context.cpp b/engines/wintermute/ad/ad_response_context.cpp index ec2eaa98fb0..40f0f155173 100644 --- a/engines/wintermute/ad/ad_response_context.cpp +++ b/engines/wintermute/ad/ad_response_context.cpp @@ -60,10 +60,9 @@ void AdResponseContext::setContext(const char *context) { delete[] _context; _context = nullptr; if (context) { - _context = new char [strlen(context) + 1]; - if (_context) { - strcpy(_context, context); - } + size_t contextSize = strlen(context) + 1; + _context = new char [contextSize]; + Common::strcpy_s(_context, contextSize, context); } } diff --git a/engines/wintermute/ad/ad_scene_state.cpp b/engines/wintermute/ad/ad_scene_state.cpp index a576826aa7a..2959cd4d99b 100644 --- a/engines/wintermute/ad/ad_scene_state.cpp +++ b/engines/wintermute/ad/ad_scene_state.cpp @@ -65,10 +65,9 @@ bool AdSceneState::persist(BasePersistenceManager *persistMgr) { ////////////////////////////////////////////////////////////////////////// void AdSceneState::setFilename(const char *filename) { delete[] _filename; - _filename = new char [strlen(filename) + 1]; - if (_filename) { - strcpy(_filename, filename); - } + size_t filenameSize = strlen(filename) + 1; + _filename = new char [filenameSize]; + Common::strcpy_s(_filename, filenameSize, filename); } const char *AdSceneState::getFilename() const { diff --git a/engines/wintermute/ad/ad_sentence.cpp b/engines/wintermute/ad/ad_sentence.cpp index 3c60468985b..3f30d36c8c6 100644 --- a/engines/wintermute/ad/ad_sentence.cpp +++ b/engines/wintermute/ad/ad_sentence.cpp @@ -91,26 +91,20 @@ AdSentence::~AdSentence() { ////////////////////////////////////////////////////////////////////////// void AdSentence::setText(const char *text) { - if (_text) { - delete[] _text; - } - _text = new char[strlen(text) + 1]; - if (_text) { - strcpy(_text, text); - } + delete[] _text; + size_t textSize = strlen(text) + 1; + _text = new char[textSize]; + Common::strcpy_s(_text, textSize, text); } ////////////////////////////////////////////////////////////////////////// void AdSentence::setStances(const char *stances) { - if (_stances) { - delete[] _stances; - } + delete[] _stances; if (stances) { - _stances = new char[strlen(stances) + 1]; - if (_stances) { - strcpy(_stances, stances); - } + size_t stancesSize = strlen(stances) + 1; + _stances = new char[stancesSize]; + Common::strcpy_s(_stances, stancesSize, stances); } else { _stances = nullptr; } diff --git a/engines/wintermute/base/base.cpp b/engines/wintermute/base/base.cpp index 6d27dfd75e3..4146a0d153e 100644 --- a/engines/wintermute/base/base.cpp +++ b/engines/wintermute/base/base.cpp @@ -116,26 +116,20 @@ bool BaseClass::parseEditorProperty(char *buffer, bool complete) { while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 0) { switch (cmd) { - case TOKEN_NAME: + case TOKEN_NAME: { delete[] propName; - propName = new char[strlen(params) + 1]; - if (propName) { - strcpy(propName, params); - } else { - cmd = PARSERR_GENERIC; - } + size_t propNameSize = strlen(params) + 1; + propName = new char[propNameSize]; + Common::strcpy_s(propName, propNameSize, params); break; - - case TOKEN_VALUE: + } + case TOKEN_VALUE: { delete[] propValue; - propValue = new char[strlen(params) + 1]; - if (propValue) { - strcpy(propValue, params); - } else { - cmd = PARSERR_GENERIC; - } + size_t propValueSize = strlen(params) + 1; + propValue = new char[propValueSize]; + Common::strcpy_s(propValue, propValueSize, params); break; - + } default: break; } diff --git a/engines/wintermute/base/base_frame.cpp b/engines/wintermute/base/base_frame.cpp index a863d0d1760..6d5e3b38e81 100644 --- a/engines/wintermute/base/base_frame.cpp +++ b/engines/wintermute/base/base_frame.cpp @@ -280,8 +280,9 @@ bool BaseFrame::loadBuffer(char *buffer, int lifeTime, bool keepLoaded) { break; case TOKEN_APPLY_EVENT: { - char *event = new char[strlen(params) + 1]; - strcpy(event, params); + size_t eventSize = strlen(params) + 1; + char *event = new char[eventSize]; + Common::strcpy_s(event, eventSize, params); _applyEvent.add(event); } break; diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp index 31fd8d4c591..3864063f6d5 100644 --- a/engines/wintermute/base/base_game.cpp +++ b/engines/wintermute/base/base_game.cpp @@ -1228,8 +1228,9 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "ExpandString") == 0) { stack->correctParams(1); ScValue *val = stack->pop(); - char *str = new char[strlen(val->getString()) + 1]; - strcpy(str, val->getString()); + size_t strSize = strlen(val->getString()) + 1; + char *str = new char[strSize]; + Common::strcpy_s(str, strSize, val->getString()); expandStringByStringTable(&str); stack->pushString(str); delete[] str; @@ -1460,8 +1461,9 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack const char *xdesc = stack->pop()->getString(); bool quick = stack->pop()->getBool(false); - char *desc = new char[strlen(xdesc) + 1]; - strcpy(desc, xdesc); + size_t descSize = strlen(xdesc) + 1; + char *desc = new char[descSize]; + Common::strcpy_s(desc, descSize, xdesc); stack->pushBool(true); if (DID_FAIL(saveGame(slot, desc, quick))) { stack->pop(); @@ -3633,8 +3635,9 @@ bool BaseGame::externalCall(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "ToString") == 0) { stack->correctParams(1); const char *str = stack->pop()->getString(); - char *str2 = new char[strlen(str) + 1]; - strcpy(str2, str); + size_t strSize = strlen(str) + 1; + char *str2 = new char[strSize]; + Common::strcpy_s(str2, strSize, str); stack->pushString(str2); delete[] str2; } @@ -3703,7 +3706,7 @@ bool BaseGame::externalCall(ScScript *script, ScStack *stack, ScStack *thisStack // Let's make copies before modifying stack char *copy = new char[size]; - strcpy(copy, str); + Common::strcpy_s(copy, size, str); // There is no way to makeSXArray() with exactly 1 given element // That's why we are creating empty Array and SXArray::push() later @@ -3737,8 +3740,9 @@ bool BaseGame::externalCall(ScScript *script, ScStack *stack, ScStack *thisStack else if (strcmp(name, "Trim") == 0 || strcmp(name, "lTrim") == 0 || strcmp(name, "rTrim") == 0) { stack->correctParams(1); const char *str = stack->pop()->getString(); - char *copy = new char[strlen(str) + 1]; - strcpy(copy, str); + size_t copySize = strlen(str) + 1; + char *copy = new char[copySize]; + Common::strcpy_s(copy, copySize, str); char *ptr = copy; if (strcmp(name, "rTrim") != 0) { diff --git a/engines/wintermute/base/base_game_settings.cpp b/engines/wintermute/base/base_game_settings.cpp index f6e8808129f..5643c56ad04 100644 --- a/engines/wintermute/base/base_game_settings.cpp +++ b/engines/wintermute/base/base_game_settings.cpp @@ -122,14 +122,13 @@ bool BaseGameSettings::loadSettings(const char *filename) { buffer = params; while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 0) { switch (cmd) { - case TOKEN_GAME: + case TOKEN_GAME: { delete[] _gameFile; - _gameFile = new char[strlen(params) + 1]; - if (_gameFile) { - strcpy(_gameFile, params); - } + size_t gameFileSize = strlen(params) + 1; + _gameFile = new char[gameFileSize]; + Common::strcpy_s(_gameFile, gameFileSize, params); break; - + } case TOKEN_STRING_TABLE: if (DID_FAIL(_stringTable->loadFile(params))) { cmd = PARSERR_GENERIC; diff --git a/engines/wintermute/base/base_named_object.cpp b/engines/wintermute/base/base_named_object.cpp index 4743cd14cbb..adafec3e55d 100644 --- a/engines/wintermute/base/base_named_object.cpp +++ b/engines/wintermute/base/base_named_object.cpp @@ -61,10 +61,9 @@ void BaseNamedObject::setName(const char *name) { return; } - _name = new char [strlen(name) + 1]; - if (_name != nullptr) { - strcpy(_name, name); - } + size_t nameSize = strlen(name) + 1; + _name = new char [nameSize]; + Common::strcpy_s(_name, nameSize, name); } } // End of namespace Wintermute diff --git a/engines/wintermute/base/base_object.cpp b/engines/wintermute/base/base_object.cpp index b6f225d95e9..28fc54f39f2 100644 --- a/engines/wintermute/base/base_object.cpp +++ b/engines/wintermute/base/base_object.cpp @@ -182,11 +182,10 @@ void BaseObject::setCaption(const char *caption, int caseVal) { } delete[] _caption[caseVal - 1]; - _caption[caseVal - 1] = new char[strlen(caption) + 1]; - if (_caption[caseVal - 1]) { - strcpy(_caption[caseVal - 1], caption); - _gameRef->expandStringByStringTable(&_caption[caseVal - 1]); - } + size_t captionSize = strlen(caption) + 1; + _caption[caseVal - 1] = new char[captionSize]; + Common::strcpy_s(_caption[caseVal - 1], captionSize, caption); + _gameRef->expandStringByStringTable(&_caption[caseVal - 1]); } @@ -1353,10 +1352,9 @@ void BaseObject::setSoundEvent(const char *eventName) { delete[] _soundEvent; _soundEvent = nullptr; if (eventName) { - _soundEvent = new char[strlen(eventName) + 1]; - if (_soundEvent) { - strcpy(_soundEvent, eventName); - } + size_t soundEventSize = strlen(eventName) + 1; + _soundEvent = new char[soundEventSize]; + Common::strcpy_s(_soundEvent, soundEventSize, eventName); } } diff --git a/engines/wintermute/base/base_parser.cpp b/engines/wintermute/base/base_parser.cpp index 527533fe4c1..95b7aea222a 100644 --- a/engines/wintermute/base/base_parser.cpp +++ b/engines/wintermute/base/base_parser.cpp @@ -43,8 +43,8 @@ namespace Wintermute { ////////////////////////////////////////////////////////////////////// BaseParser::BaseParser() { - _whiteSpace = new char [strlen(WHITESPACE) + 1]; - strcpy(_whiteSpace, WHITESPACE); + _whiteSpace = new char [sizeof(WHITESPACE)]; + Common::strcpy_s(_whiteSpace, sizeof(WHITESPACE), WHITESPACE); } @@ -93,7 +93,7 @@ int32 BaseParser::getObject(char **buf, const TokenDesc *tokens, char **name, ch if (p && p > *buf) { strncpy(_lastOffender, *buf, MIN((uint32)255, (uint32)(p - *buf))); // TODO, clean } else { - strcpy(_lastOffender, ""); + _lastOffender[0] = '\0'; } return PARSERR_TOKENNOTFOUND; @@ -388,7 +388,9 @@ int32 BaseParser::scanStr(const char *in, const char *format, ...) { Common::strlcpy(a, in, (int)(in2 - in) + 1); in = in2 + 1; } else { - strcpy(a, in); + // FIXME: Use a sensible value here + // Happily this is not used + Common::strcpy_s(a, 4096, in); in = strchr(in, 0); } } else { diff --git a/engines/wintermute/base/base_script_holder.cpp b/engines/wintermute/base/base_script_holder.cpp index 2f0afbc4a7f..81b247e4f5f 100644 --- a/engines/wintermute/base/base_script_holder.cpp +++ b/engines/wintermute/base/base_script_holder.cpp @@ -76,10 +76,9 @@ void BaseScriptHolder::setFilename(const char *filename) { if (filename == nullptr) { return; } - _filename = new char [strlen(filename) + 1]; - if (_filename != nullptr) { - strcpy(_filename, filename); - } + size_t filenameSize = strlen(filename) + 1; + _filename = new char [filenameSize]; + Common::strcpy_s(_filename, filenameSize, filename); } @@ -316,8 +315,9 @@ bool BaseScriptHolder::addScript(const char *filename) { #else scr = new ScScript(_gameRef, _gameRef->_scEngine); #endif - scr->_filename = new char[strlen(filename) + 1]; - strcpy(scr->_filename, filename); + size_t filenameSize = strlen(filename) + 1; + scr->_filename = new char[filenameSize]; + Common::strcpy_s(scr->_filename, filenameSize, filename); scr->_state = SCRIPT_ERROR; scr->_owner = this; _scripts.add(scr); @@ -397,26 +397,20 @@ bool BaseScriptHolder::parseProperty(char *buffer, bool complete) { while ((cmd = parser.getCommand(&buffer, commands, ¶ms)) > 0) { switch (cmd) { - case TOKEN_NAME: + case TOKEN_NAME: { delete[] propName; - propName = new char[strlen(params) + 1]; - if (propName) { - strcpy(propName, params); - } else { - cmd = PARSERR_GENERIC; - } + size_t propNameSize = strlen(params) + 1; + propName = new char[propNameSize]; + Common::strcpy_s(propName, propNameSize, params); break; - - case TOKEN_VALUE: + } + case TOKEN_VALUE: { delete[] propValue; - propValue = new char[strlen(params) + 1]; - if (propValue) { - strcpy(propValue, params); - } else { - cmd = PARSERR_GENERIC; - } + size_t propValueSize = strlen(params) + 1; + propValue = new char[propValueSize]; + Common::strcpy_s(propValue, propValueSize, params); break; - + } default: break; } @@ -494,14 +488,14 @@ ScScript *BaseScriptHolder::invokeMethodThread(const char *methodName) { ////////////////////////////////////////////////////////////////////////// void BaseScriptHolder::scDebuggerDesc(char *buf, int bufSize) { - strcpy(buf, scToString()); + Common::strcpy_s(buf, bufSize, scToString()); if (getName() && strcmp(getName(), "") != 0) { - strcat(buf, " Name: "); - strcat(buf, getName()); + Common::strcat_s(buf, bufSize, " Name: "); + Common::strcat_s(buf, bufSize, getName()); } if (_filename) { - strcat(buf, " File: "); - strcat(buf, _filename); + Common::strcat_s(buf, bufSize, " File: "); + Common::strcat_s(buf, bufSize, _filename); } } diff --git a/engines/wintermute/base/base_scriptable.cpp b/engines/wintermute/base/base_scriptable.cpp index 3d0ac927a75..b8ca42338da 100644 --- a/engines/wintermute/base/base_scriptable.cpp +++ b/engines/wintermute/base/base_scriptable.cpp @@ -173,7 +173,7 @@ int BaseScriptable::scCompare(BaseScriptable *val) { ////////////////////////////////////////////////////////////////////////// void BaseScriptable::scDebuggerDesc(char *buf, int bufSize) { - strcpy(buf, scToString()); + Common::strcpy_s(buf, bufSize, scToString()); } ////////////////////////////////////////////////////////////////////////// diff --git a/engines/wintermute/base/base_sprite.cpp b/engines/wintermute/base/base_sprite.cpp index c1d4a9e515c..73fab410bfa 100644 --- a/engines/wintermute/base/base_sprite.cpp +++ b/engines/wintermute/base/base_sprite.cpp @@ -281,10 +281,9 @@ bool BaseSprite::loadBuffer(char *buffer, bool complete, int lifeTime, TSpriteCa case TOKEN_EDITOR_BG_FILE: if (_gameRef->_editorMode) { delete[] _editorBgFile; - _editorBgFile = new char[strlen(params) + 1]; - if (_editorBgFile) { - strcpy(_editorBgFile, params); - } + size_t editorBgFileSize = strlen(params) + 1; + _editorBgFile = new char[editorBgFileSize]; + Common::strcpy_s(_editorBgFile, editorBgFileSize, params); } break; diff --git a/engines/wintermute/base/base_string_table.cpp b/engines/wintermute/base/base_string_table.cpp index 77ad7c9d070..cad4c21e55d 100644 --- a/engines/wintermute/base/base_string_table.cpp +++ b/engines/wintermute/base/base_string_table.cpp @@ -92,8 +92,9 @@ char *BaseStringTable::getKey(const char *str) const { StringsIter it = _strings.find(key); if (it != _strings.end()) { - newStr = new char[it->_value.size() + 1]; - strcpy(newStr, it->_value.c_str()); + size_t newStrSize = it->_value.size() + 1; + newStr = new char[newStrSize]; + Common::strcpy_s(newStr, newStrSize, it->_value.c_str()); if (strlen(newStr) > 0 && newStr[0] == '/' && strchr(newStr + 1, '/')) { delete[] key; char *ret = getKey(newStr); @@ -130,11 +131,13 @@ void BaseStringTable::expand(char **str) const { StringsIter it = _strings.find(key); if (it != _strings.end()) { - newStr = new char[it->_value.size() + 1]; - strcpy(newStr, it->_value.c_str()); + size_t newStrSize = it->_value.size() + 1; + newStr = new char[newStrSize]; + Common::strcpy_s(newStr, newStrSize, it->_value.c_str()); } else { - newStr = new char[strlen(value) + 1]; - strcpy(newStr, value); + size_t newStrSize = strlen(value) + 1; + newStr = new char[newStrSize]; + Common::strcpy_s(newStr, newStrSize, value); } delete[] key; @@ -149,7 +152,7 @@ void BaseStringTable::expand(char **str) const { ////////////////////////////////////////////////////////////////////////// void BaseStringTable::expand(Common::String &str) const { char *tmp = new char[str.size() + 1]; - strcpy(tmp, str.c_str()); + Common::strcpy_s(tmp, str.size() + 1, str.c_str()); expand(&tmp); str = tmp; delete[] tmp; diff --git a/engines/wintermute/base/base_sub_frame.cpp b/engines/wintermute/base/base_sub_frame.cpp index 6a4c06c37d9..c9b288500aa 100644 --- a/engines/wintermute/base/base_sub_frame.cpp +++ b/engines/wintermute/base/base_sub_frame.cpp @@ -685,7 +685,7 @@ bool BaseSubFrame::setSurface(const Common::String &filename, bool defaultCK, by _surface = _gameRef->_surfaceStorage->addSurface(filename, defaultCK, ckRed, ckGreen, ckBlue, lifeTime, keepLoaded); if (_surface) { _surfaceFilename = new char[filename.size() + 1]; - strcpy(_surfaceFilename, filename.c_str()); + Common::strcpy_s(_surfaceFilename, filename.size() + 1, filename.c_str()); _cKDefault = defaultCK; _cKRed = ckRed; diff --git a/engines/wintermute/base/file/base_save_thumb_file.cpp b/engines/wintermute/base/file/base_save_thumb_file.cpp index 7cea342ae90..a9016e5d691 100644 --- a/engines/wintermute/base/file/base_save_thumb_file.cpp +++ b/engines/wintermute/base/file/base_save_thumb_file.cpp @@ -55,8 +55,9 @@ bool BaseSaveThumbFile::open(const Common::String &filename) { return STATUS_FAILED; } - char *tempFilename = new char[strlen(filename.c_str()) - 8]; - strcpy(tempFilename, filename.c_str() + 9); + size_t filenameSize = strlen(filename.c_str()) - 9 + 1; + char *tempFilename = new char[filenameSize]; + Common::strcpy_s(tempFilename, filenameSize, filename.c_str() + 9); for (uint32 i = 0; i < strlen(tempFilename); i++) { if (tempFilename[i] < '0' || tempFilename[i] > '9') { tempFilename[i] = '\0'; diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp index fef8a356e13..4e3cb6cd52a 100644 --- a/engines/wintermute/base/gfx/xmodel.cpp +++ b/engines/wintermute/base/gfx/xmodel.cpp @@ -223,7 +223,7 @@ bool XModel::mergeFromFile(const Common::String &filename) { } if (!found) { char *path = new char[filename.size() + 1]; - strcpy(path, filename.c_str()); + Common::strcpy_s(path, filename.size() + 1, filename.c_str()); _mergedModels.add(path); } diff --git a/engines/wintermute/base/particles/part_emitter.cpp b/engines/wintermute/base/particles/part_emitter.cpp index d89b13254e5..21826610104 100644 --- a/engines/wintermute/base/particles/part_emitter.cpp +++ b/engines/wintermute/base/particles/part_emitter.cpp @@ -136,8 +136,9 @@ bool PartEmitter::addSprite(const char *filename) { BaseFileManager::getEngineInstance()->closeFile(File); } - char *str = new char[strlen(filename) + 1]; - strcpy(str, filename); + size_t filenameSize = strlen(filename) + 1; + char *str = new char[filenameSize]; + Common::strcpy_s(str, filenameSize, filename); _sprites.add(str); return STATUS_OK; diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp index 5b8b71fffa8..27822053cf7 100644 --- a/engines/wintermute/base/scriptables/script.cpp +++ b/engines/wintermute/base/scriptables/script.cpp @@ -258,10 +258,9 @@ bool ScScript::create(const char *filename, byte *buffer, uint32 size, BaseScrip delete[] _threadEvent; _threadEvent = nullptr; - _filename = new char[strlen(filename) + 1]; - if (_filename) { - strcpy(_filename, filename); - } + size_t filenameSize = strlen(filename) + 1; + _filename = new char[filenameSize]; + Common::strcpy_s(_filename, filenameSize, filename); _buffer = new byte [size]; if (!_buffer) { @@ -293,21 +292,15 @@ bool ScScript::createThread(ScScript *original, uint32 initIP, const Common::Str _thread = true; _methodThread = false; _threadEvent = new char[eventName.size() + 1]; - if (_threadEvent) { - strcpy(_threadEvent, eventName.c_str()); - } + Common::strcpy_s(_threadEvent, eventName.size() + 1, eventName.c_str()); // copy filename - _filename = new char[strlen(original->_filename) + 1]; - if (_filename) { - strcpy(_filename, original->_filename); - } + size_t filenameSize = strlen(original->_filename) + 1; + _filename = new char[filenameSize]; + Common::strcpy_s(_filename, filenameSize, original->_filename); // copy buffer _buffer = new byte [original->_bufferSize]; - if (!_buffer) { - return STATUS_FAILED; - } memcpy(_buffer, original->_buffer, original->_bufferSize); _bufferSize = original->_bufferSize; @@ -350,21 +343,15 @@ bool ScScript::createMethodThread(ScScript *original, const Common::String &meth _thread = true; _methodThread = true; _threadEvent = new char[methodName.size() + 1]; - if (_threadEvent) { - strcpy(_threadEvent, methodName.c_str()); - } + Common::strcpy_s(_threadEvent, methodName.size() + 1, methodName.c_str()); // copy filename - _filename = new char[strlen(original->_filename) + 1]; - if (_filename) { - strcpy(_filename, original->_filename); - } + size_t filenameSize = strlen(original->_filename) + 1; + _filename = new char[filenameSize]; + Common::strcpy_s(_filename, filenameSize, original->_filename); // copy buffer _buffer = new byte [original->_bufferSize]; - if (!_buffer) { - return STATUS_FAILED; - } memcpy(_buffer, original->_buffer, original->_bufferSize); _bufferSize = original->_bufferSize; @@ -640,8 +627,9 @@ bool ScScript::executeInstruction() { // push var // push string str = _stack->pop()->getString(); - char *methodName = new char[strlen(str) + 1]; - strcpy(methodName, str); + size_t methodNameSize = strlen(str) + 1; + char *methodName = new char[methodNameSize]; + Common::strcpy_s(methodName, methodNameSize, str); ScValue *var = _stack->pop(); if (var->_type == VAL_VARIABLE_REF) { @@ -893,9 +881,10 @@ bool ScScript::executeInstruction() { if (op1->isNULL() || op2->isNULL()) { _operand->setNULL(); } else if (op1->getType() == VAL_STRING || op2->getType() == VAL_STRING) { - char *tempStr = new char [strlen(op1->getString()) + strlen(op2->getString()) + 1]; - strcpy(tempStr, op1->getString()); - strcat(tempStr, op2->getString()); + size_t tempStrSize = strlen(op1->getString()) + strlen(op2->getString()) + 1; + char *tempStr = new char [tempStrSize]; + Common::strcpy_s(tempStr, tempStrSize, op1->getString()); + Common::strcat_s(tempStr, tempStrSize, op2->getString()); _operand->setString(tempStr); delete[] tempStr; } else if (op1->getType() == VAL_INT && op2->getType() == VAL_INT) { diff --git a/engines/wintermute/base/scriptables/script_ext_array.cpp b/engines/wintermute/base/scriptables/script_ext_array.cpp index 75edbb4d4e6..7ebf44d4041 100644 --- a/engines/wintermute/base/scriptables/script_ext_array.cpp +++ b/engines/wintermute/base/scriptables/script_ext_array.cpp @@ -75,19 +75,19 @@ SXArray::~SXArray() { ////////////////////////////////////////////////////////////////////////// const char *SXArray::scToString() { char dummy[32768]; - strcpy(dummy, ""); + dummy[0] = '\0'; char propName[20]; for (int i = 0; i < _length; i++) { sprintf(propName, "%d", i); ScValue *val = _values->getProp(propName); if (val) { if (strlen(dummy) + strlen(val->getString()) < 32768) { - strcat(dummy, val->getString()); + Common::strcat_s(dummy, val->getString()); } } if (i < _length - 1 && strlen(dummy) + 1 < 32768) { - strcat(dummy, ","); + Common::strcat_s(dummy, ","); } } _strRep = dummy; diff --git a/engines/wintermute/base/scriptables/script_ext_string.cpp b/engines/wintermute/base/scriptables/script_ext_string.cpp index ab7892685db..11b2197dc82 100644 --- a/engines/wintermute/base/scriptables/script_ext_string.cpp +++ b/engines/wintermute/base/scriptables/script_ext_string.cpp @@ -83,7 +83,7 @@ void SXString::setStringVal(const char *val) { _string = nullptr; _string = new char[_capacity](); } - strcpy(_string, val); + Common::strcpy_s(_string, _capacity, val); } @@ -396,7 +396,7 @@ bool SXString::scSetProperty(const char *name, ScValue *value) { } else if (newCap != _capacity) { char *newStr = new char[newCap](); if (newStr) { - strcpy(newStr, _string); + Common::strcpy_s(newStr, newCap, _string); delete[] _string; _string = newStr; _capacity = newCap; diff --git a/engines/wintermute/base/scriptables/script_value.cpp b/engines/wintermute/base/scriptables/script_value.cpp index aae01f5210e..2cca3923bf6 100644 --- a/engines/wintermute/base/scriptables/script_value.cpp +++ b/engines/wintermute/base/scriptables/script_value.cpp @@ -448,20 +448,16 @@ void ScValue::setString(const Common::String &val) { ////////////////////////////////////////////////////////////////////////// void ScValue::setStringVal(const char *val) { - if (_valString) { - delete[] _valString; - _valString = nullptr; - } + delete[] _valString; + _valString = nullptr; if (val == nullptr) { - _valString = nullptr; return; } - _valString = new char [strlen(val) + 1]; - if (_valString) { - strcpy(_valString, val); - } + size_t valSize = strlen(val) + 1; + _valString = new char[valSize]; + Common::strcpy_s(_valString, valSize, val); } diff --git a/engines/wintermute/ui/ui_edit.cpp b/engines/wintermute/ui/ui_edit.cpp index 9e533d82d18..a3a142293fb 100644 --- a/engines/wintermute/ui/ui_edit.cpp +++ b/engines/wintermute/ui/ui_edit.cpp @@ -559,10 +559,9 @@ void UIEdit::setCursorChar(const char *character) { return; } delete[] _cursorChar; - _cursorChar = new char [strlen(character) + 1]; - if (_cursorChar) { - strcpy(_cursorChar, character); - } + size_t cursorCharSize = strlen(character) + 1; + _cursorChar = new char [cursorCharSize]; + Common::strcpy_s(_cursorChar, cursorCharSize, character); } diff --git a/engines/wintermute/ui/ui_object.cpp b/engines/wintermute/ui/ui_object.cpp index c1aff162d7d..6a6defdbf39 100644 --- a/engines/wintermute/ui/ui_object.cpp +++ b/engines/wintermute/ui/ui_object.cpp @@ -99,13 +99,12 @@ void UIObject::setText(const char *text) { if (_text) { delete[] _text; } - _text = new char [strlen(text) + 1]; - if (_text) { - strcpy(_text, text); - for (uint32 i = 0; i < strlen(_text); i++) { - if (_text[i] == '|') { - _text[i] = '\n'; - } + size_t textSize = strlen(text) + 1; + _text = new char [textSize]; + Common::strcpy_s(_text, textSize, text); + for (uint32 i = 0; i < strlen(_text); i++) { + if (_text[i] == '|') { + _text[i] = '\n'; } } } diff --git a/engines/wintermute/utils/utils.cpp b/engines/wintermute/utils/utils.cpp index ca641836204..0a1378b217b 100644 --- a/engines/wintermute/utils/utils.cpp +++ b/engines/wintermute/utils/utils.cpp @@ -92,10 +92,9 @@ void BaseUtils::debugMessage(const char *text) { ////////////////////////////////////////////////////////////////////////// char *BaseUtils::setString(char **string, const char *value) { delete[] *string; - *string = new char[strlen(value) + 1]; - if (*string) { - strcpy(*string, value); - } + size_t stringSize = strlen(value) + 1; + *string = new char[stringSize]; + Common::strcpy_s(*string, stringSize, value); return *string; }