Adds assertion check to check if top stack is out of bounds

This commit is contained in:
smallmodel 2024-06-22 19:03:27 +02:00
parent 01d938b5ba
commit 2f48ca6adb
No known key found for this signature in database
GPG key ID: 9F2D623CEDF08512
2 changed files with 17 additions and 7 deletions

View file

@ -79,6 +79,7 @@ ScriptVMStack::ScriptVMStack()
: localStack(nullptr)
, stackBottom(nullptr)
, pTop(nullptr)
, m_bMarkStack(false)
{}
ScriptVMStack::ScriptVMStack(size_t stackSize)
@ -157,11 +158,13 @@ ScriptVariable& ScriptVMStack::SetTop(ScriptVariable& newTop)
ScriptVariable& ScriptVMStack::GetTop() const
{
assert(m_bMarkStack || pTop < stackBottom);
return *pTop;
}
ScriptVariable& ScriptVMStack::GetTop(size_t offset) const
{
assert(m_bMarkStack || (pTop + offset) < stackBottom);
return *(pTop + offset);
}
@ -210,23 +213,27 @@ ScriptVariable& ScriptVMStack::PopAndGet(size_t offset)
ScriptVariable& ScriptVMStack::Push()
{
assert(!m_bMarkStack && (pTop + 1) < stackBottom);
return *(pTop++);
}
ScriptVariable& ScriptVMStack::Push(size_t offset)
{
ScriptVariable& old = *pTop;
assert(!m_bMarkStack && (pTop + offset) < stackBottom);
pTop += offset;
return old;
}
ScriptVariable& ScriptVMStack::PushAndGet()
{
assert(!m_bMarkStack && (pTop + 1) < stackBottom);
return *++pTop;
}
ScriptVariable& ScriptVMStack::PushAndGet(size_t offset)
{
assert(!m_bMarkStack && (pTop + offset) < stackBottom);
pTop += offset;
return *pTop;
}
@ -305,7 +312,6 @@ ScriptVM::ScriptVM()
m_pOldData = NULL;
m_OldDataSize = 0;
m_bMarkStack = false;
m_StackPos = NULL;
}
@ -333,7 +339,6 @@ ScriptVM::ScriptVM(ScriptClass *scriptClass, unsigned char *pCodePos, ScriptThre
m_pOldData = NULL;
m_OldDataSize = 0;
m_bMarkStack = false;
m_StackPos = NULL;
m_ScriptClass->AddThread(this);
@ -1081,7 +1086,7 @@ void ScriptVM::Execute(ScriptVariable *data, int dataSize, str label)
Director.cmdCount = 0;
}
if (!m_bMarkStack) {
if (!m_VMStack.m_bMarkStack) {
/*
assert(pTop >= localStack && pTop < localStack + localStackSize);
if (pTop < localStack)
@ -1549,7 +1554,7 @@ void ScriptVM::Execute(ScriptVariable *data, int dataSize, str label)
case OP_MARK_STACK_POS:
m_StackPos = &m_VMStack.GetTop();
m_bMarkStack = true;
m_VMStack.m_bMarkStack = true;
break;
case OP_STORE_PARAM:
@ -1564,7 +1569,7 @@ void ScriptVM::Execute(ScriptVariable *data, int dataSize, str label)
case OP_RESTORE_STACK_POS:
m_VMStack.SetTop(*m_StackPos);
m_bMarkStack = false;
m_VMStack.m_bMarkStack = false;
break;
case OP_STORE_ARRAY:

View file

@ -123,7 +123,12 @@ private:
/** The local stack size. */
ScriptVariable *stackBottom;
/** Variable from the top stack of the local stack. */
ScriptVariable *pTop;
ScriptVariable* pTop;
public:
/** Whether or not the stack is marked. */
/** changed by OP_MARK_STACK_POS and OP_RESTORE_STACK_POS */
bool m_bMarkStack;
};
class ScriptVM
@ -159,7 +164,7 @@ public:
// parameters variables
ScriptVariable *m_pOldData; // old fastEvent data, to cleanup
int m_OldDataSize;
bool m_bMarkStack; // changed by OP_MARK_STACK_POS and OP_RESTORE_STACK_POS
//bool m_bMarkStack; // changed by OP_MARK_STACK_POS and OP_RESTORE_STACK_POS
Event fastEvent; // parameter list, set when the VM is executed
private: