1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-02-20 19:57:12 +01:00

Fix bug in plugin caused by not popping the closure from the stack after calling it.

This would've caused the plugin to run out of stack memory eventually.
This commit is contained in:
Sandu Liviu Catalin 2018-07-05 21:01:08 +03:00
parent 50dec8d958
commit f51b4968ac
3 changed files with 19 additions and 1 deletions

View File

@ -1506,7 +1506,7 @@ struct StackGuard
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
~StackGuard()
{
sq_pop(m_VM, sq_gettop(m_VM) - m_Top);
Restore();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -1519,6 +1519,20 @@ struct StackGuard
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
StackGuard & operator = (StackGuard &&) = delete;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Restore the stack to what was known to be.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Restore() const
{
// Retrieve the new stack top
const SQInteger top = sq_gettop(m_VM);
// Did the stack size change?
if (top > m_Top)
{
sq_pop(m_VM, top - m_Top); // Trim the stack
}
}
private:
HSQUIRRELVM m_VM; ///< The VM where the stack should be restored.

View File

@ -146,6 +146,8 @@ private:
}
// Make the function call and store the result
const SQRESULT res = sq_call(vm, mArgc + 1, false, !mQuiet);
// Pop the callback object from the stack
sq_pop(vm, 1);
// Validate the result
if (SQ_FAILED(res))
{

View File

@ -86,6 +86,8 @@ Tasks::Interval Tasks::Task::Execute()
}
// Make the function call and store the result
const SQRESULT res = sq_call(vm, mArgc + 1, false, ErrorHandling::IsEnabled());
// Pop the callback object from the stack
sq_pop(vm, 1);
// Validate the result
if (SQ_FAILED(res))
{