From 270c77da5b8e92a9132c655a86c7b0a9d6cf5dfe Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 25 Aug 2015 10:49:59 +0200 Subject: [PATCH] Fixed memory corruption in produce(), closes #600 --- src/script/scriptfunc.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp index c1d87878..b74facc3 100644 --- a/src/script/scriptfunc.cpp +++ b/src/script/scriptfunc.cpp @@ -1514,7 +1514,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v { CScript* script = static_cast(user); CObject* me = script->m_object; - const char* name = ""; + std::string name = ""; Math::Vector pos; float angle = 0.0f; ObjectType type = OBJECT_NULL; @@ -1534,8 +1534,6 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v power = var->GetValFloat(); else power = -1.0f; - - name = ""; } else { @@ -1550,7 +1548,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v if ( var != nullptr ) { CBotString cbs = var->GetValString(); - name = cbs; + name = static_cast(cbs); var = var->GetNext(); if ( var != nullptr ) { @@ -1563,7 +1561,6 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v } else { - name = ""; power = -1.0f; } } @@ -1589,12 +1586,12 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v power = 1.0f; } object = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, type, power); - if ( object == nullptr ) + if (object == nullptr) { result->SetValInt(1); // error return true; } - if(type == OBJECT_MOBILEdr) + if (type == OBJECT_MOBILEdr) { assert(object->Implements(ObjectInterfaceType::Old)); // TODO: temporary hack dynamic_cast(object)->SetManual(true); @@ -1602,7 +1599,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v script->m_main->CreateShortcuts(); } - if (name[0] != 0) + if (!name.empty()) { std::string name2 = InjectLevelPathsForCurrentLevel(name, "ai"); if (object->Implements(ObjectInterfaceType::Programmable))