Skip to content

Commit cdb8de8

Browse files
committed
Fix (potential?) memory leaks from getVariant() (SquirrelVM)
Free values before assignment.
1 parent 4d485d2 commit cdb8de8

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

sp/src/public/vscript/ivscript.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ struct ScriptVariant_t
497497

498498
bool AssignTo( ScriptVariant_t *pDest )
499499
{
500+
pDest->Free();
500501
pDest->m_type = m_type;
501502
if ( m_flags & SV_FREE )
502503
{

sp/src/vscript/vscript_squirrel.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12051205
{
12061206
case OT_NULL:
12071207
{
1208+
variant.Free();
12081209
variant.m_flags = 0;
12091210
// TODO: Should this be (HSCRIPT)nullptr
12101211
variant.m_type = FIELD_VOID;
@@ -1217,6 +1218,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12171218
{
12181219
return false;
12191220
}
1221+
variant.Free();
12201222
variant = (int)val;
12211223
return true;
12221224
}
@@ -1227,6 +1229,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12271229
{
12281230
return false;
12291231
}
1232+
variant.Free();
12301233
variant = (float)val;
12311234
return true;
12321235
}
@@ -1237,6 +1240,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12371240
{
12381241
return false;
12391242
}
1243+
variant.Free();
12401244
variant = val ? true : false;
12411245
return true;
12421246
}
@@ -1248,6 +1252,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12481252
{
12491253
return false;
12501254
}
1255+
variant.Free();
12511256
char* buffer = (char*)malloc(size + 1);
12521257
V_memcpy(buffer, val, size);
12531258
buffer[size] = 0;
@@ -1263,6 +1268,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12631268
tag == TYPETAG_VECTOR &&
12641269
SQ_SUCCEEDED(sq_getinstanceup(vm, idx, (SQUserPointer*)&v, TYPETAG_VECTOR)))
12651270
{
1271+
variant.Free();
12661272
variant = (Vector*)malloc(sizeof(Vector));
12671273
variant.EmplaceAllocedVector(*v);
12681274
variant.m_flags |= SV_FREE;
@@ -1272,6 +1278,7 @@ bool getVariant(HSQUIRRELVM vm, SQInteger idx, ScriptVariant_t& variant)
12721278
}
12731279
default:
12741280
{
1281+
variant.Free();
12751282
HSQOBJECT* obj = new HSQOBJECT;
12761283
sq_resetobject(obj);
12771284
sq_getstackobj(vm, idx, obj);

0 commit comments

Comments
 (0)