Guard get/set/tostring_stub() against illegal Squirrel instances

Also streamline SQUserPointer usage in sq_getinstanceup() and
sq_getuserpointer() calls to write directly to a pointer of the expected
type.
This commit is contained in:
Alexander 'z33ky' Hirsch 2025-06-24 20:58:54 +02:00
parent 9c38e4e295
commit 3301edc54d

View File

@ -1583,7 +1583,10 @@ SQInteger constructor_stub(HSQUIRRELVM vm)
SQInteger tostring_stub(HSQUIRRELVM vm) SQInteger tostring_stub(HSQUIRRELVM vm)
{ {
ClassInstanceData* classInstanceData = nullptr; ClassInstanceData* classInstanceData = nullptr;
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0); if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0)))
{
return SQ_ERROR;
}
char buffer[128] = ""; char buffer[128] = "";
@ -1613,7 +1616,10 @@ SQInteger tostring_stub(HSQUIRRELVM vm)
SQInteger get_stub(HSQUIRRELVM vm) SQInteger get_stub(HSQUIRRELVM vm)
{ {
ClassInstanceData* classInstanceData = nullptr; ClassInstanceData* classInstanceData = nullptr;
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0); if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0)))
{
return SQ_ERROR;
}
const char* key = nullptr; const char* key = nullptr;
sq_getstring(vm, 2, &key); sq_getstring(vm, 2, &key);
@ -1645,7 +1651,10 @@ SQInteger get_stub(HSQUIRRELVM vm)
SQInteger set_stub(HSQUIRRELVM vm) SQInteger set_stub(HSQUIRRELVM vm)
{ {
ClassInstanceData* classInstanceData = nullptr; ClassInstanceData* classInstanceData = nullptr;
sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0); if (SQ_FAILED(sq_getinstanceup(vm, 1, (SQUserPointer*)&classInstanceData, 0)))
{
return SQ_ERROR;
}
const char* key = nullptr; const char* key = nullptr;
sq_getstring(vm, 2, &key); sq_getstring(vm, 2, &key);
@ -2741,10 +2750,8 @@ void SquirrelVM::SetInstanceUniqeId(HSCRIPT hInstance, const char* pszId)
HSQOBJECT* obj = (HSQOBJECT*)hInstance; HSQOBJECT* obj = (HSQOBJECT*)hInstance;
sq_pushobject(vm_, *obj); sq_pushobject(vm_, *obj);
SQUserPointer self; ClassInstanceData* classInstanceData;
sq_getinstanceup(vm_, -1, &self, nullptr); sq_getinstanceup(vm_, -1, (SQUserPointer*)&classInstanceData, nullptr);
auto classInstanceData = (ClassInstanceData*)self;
classInstanceData->instanceId = pszId; classInstanceData->instanceId = pszId;
@ -2802,11 +2809,10 @@ void* SquirrelVM::GetInstanceValue(HSCRIPT hInstance, ScriptClassDesc_t* pExpect
} }
sq_pushobject(vm_, *obj); sq_pushobject(vm_, *obj);
SQUserPointer self; ClassInstanceData* classInstanceData;
sq_getinstanceup(vm_, -1, &self, nullptr); sq_getinstanceup(vm_, -1, (SQUserPointer*)&classInstanceData, nullptr);
sq_pop(vm_, 1); sq_pop(vm_, 1);
auto classInstanceData = (ClassInstanceData*)self;
if (!classInstanceData) if (!classInstanceData)
{ {