Fixed memory corruption in produce(), closes #600

master
krzys-h 2015-08-25 10:49:59 +02:00
parent b9e7143734
commit 270c77da5b
1 changed files with 5 additions and 8 deletions

View File

@ -1514,7 +1514,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
{ {
CScript* script = static_cast<CScript*>(user); CScript* script = static_cast<CScript*>(user);
CObject* me = script->m_object; CObject* me = script->m_object;
const char* name = ""; std::string name = "";
Math::Vector pos; Math::Vector pos;
float angle = 0.0f; float angle = 0.0f;
ObjectType type = OBJECT_NULL; ObjectType type = OBJECT_NULL;
@ -1534,8 +1534,6 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
power = var->GetValFloat(); power = var->GetValFloat();
else else
power = -1.0f; power = -1.0f;
name = "";
} }
else else
{ {
@ -1550,7 +1548,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
if ( var != nullptr ) if ( var != nullptr )
{ {
CBotString cbs = var->GetValString(); CBotString cbs = var->GetValString();
name = cbs; name = static_cast<const char*>(cbs);
var = var->GetNext(); var = var->GetNext();
if ( var != nullptr ) if ( var != nullptr )
{ {
@ -1563,7 +1561,6 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
} }
else else
{ {
name = "";
power = -1.0f; power = -1.0f;
} }
} }
@ -1589,12 +1586,12 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
power = 1.0f; power = 1.0f;
} }
object = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, type, power); object = CObjectManager::GetInstancePointer()->CreateObject(pos, angle, type, power);
if ( object == nullptr ) if (object == nullptr)
{ {
result->SetValInt(1); // error result->SetValInt(1); // error
return true; return true;
} }
if(type == OBJECT_MOBILEdr) if (type == OBJECT_MOBILEdr)
{ {
assert(object->Implements(ObjectInterfaceType::Old)); // TODO: temporary hack assert(object->Implements(ObjectInterfaceType::Old)); // TODO: temporary hack
dynamic_cast<COldObject*>(object)->SetManual(true); dynamic_cast<COldObject*>(object)->SetManual(true);
@ -1602,7 +1599,7 @@ bool CScriptFunctions::rProduce(CBotVar* var, CBotVar* result, int& exception, v
script->m_main->CreateShortcuts(); script->m_main->CreateShortcuts();
} }
if (name[0] != 0) if (!name.empty())
{ {
std::string name2 = InjectLevelPathsForCurrentLevel(name, "ai"); std::string name2 = InjectLevelPathsForCurrentLevel(name, "ai");
if (object->Implements(ObjectInterfaceType::Programmable)) if (object->Implements(ObjectInterfaceType::Programmable))