Skip to content

Commit d9ef7a7

Browse files
author
runrevali
committed
[[ Bug 13465 ]] Fix more memory leaks due to containers not being deleted
1 parent 1495265 commit d9ef7a7

File tree

7 files changed

+32
-6
lines changed

7 files changed

+32
-6
lines changed

docs/notes/bugfix-13465.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# More memory leaks in handler parameter creation

engine/src/cmdse.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,6 +1123,14 @@ void MCDispatchCmd::exec_ctxt(MCExecContext &ctxt)
11231123

11241124
ctxt . SetLineAndPos(line, pos);
11251125
MCEngineExecDispatch(ctxt, is_function ? HT_FUNCTION : HT_MESSAGE, *t_message, t_target_ptr, params);
1126+
1127+
// AL-2014-09-17: [[ Bug 13465 ]] Clear parameters after executing dispatch
1128+
tptr = params;
1129+
while (tptr != NULL)
1130+
{
1131+
tptr -> clear_argument();
1132+
tptr = tptr->getnext();
1133+
}
11261134
}
11271135

11281136
MCMessage::~MCMessage()

engine/src/exec-keywords.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static Exec_stat MCKeywordsExecuteStatements(MCExecContext& ctxt, MCStatement *p
111111
}
112112

113113
void MCKeywordsExecCommandOrFunction(MCExecContext& ctxt, bool resolved, MCHandler *handler, MCParameter *params, MCNameRef name, uint2 line, uint2 pos, bool platform_message, bool is_function)
114-
{
114+
{
115115
if (MCscreen->abortkey())
116116
{
117117
ctxt . LegacyThrow(EE_HANDLER_ABORT);
@@ -265,6 +265,14 @@ void MCKeywordsExecCommandOrFunction(MCExecContext& ctxt, bool resolved, MCHandl
265265
ctxt . SetExecStat(stat);
266266
else
267267
ctxt . SetExecStat(ES_NORMAL);
268+
269+
// AL-2014-09-17: [[ Bug 13465 ]] Clear parameters after executing command/function
270+
tptr = params;
271+
while (tptr != NULL)
272+
{
273+
tptr -> clear_argument();
274+
tptr = tptr->getnext();
275+
}
268276
}
269277

270278
////////////////////////////////////////////////////////////////////////////////

engine/src/handler.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,10 @@ Exec_stat MCHandler::exec(MCExecContext& ctxt, MCParameter *plist)
370370
{
371371
// AL-2014-09-16: [[ Bug 13454 ]] Delete created variables before deleting containers to prevent memory leak
372372
if (i >= npnames || !pinfo[i].is_reference)
373+
{
373374
delete newparams[i] -> getvar();
374-
delete newparams[i];
375+
delete newparams[i];
376+
}
375377
}
376378
delete newparams;
377379
MCeerror->add(EE_HANDLER_BADPARAM, firstline - 1, 1, name);
@@ -503,8 +505,10 @@ Exec_stat MCHandler::exec(MCExecContext& ctxt, MCParameter *plist)
503505
{
504506
// AL-2014-09-16: [[ Bug 13454 ]] Delete created variables before deleting containers to prevent memory leak
505507
if (i >= npnames || !pinfo[i].is_reference)
508+
{
506509
delete params[i] -> getvar();
507-
delete params[i];
510+
delete params[i];
511+
}
508512
}
509513
delete params;
510514
}

engine/src/param.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ void MCParameter::setn_argument(real8 p_number)
9696

9797
void MCParameter::clear_argument(void)
9898
{
99+
// AL-2014-09-17: [[ Bug 13465 ]] Delete container when clearing a parameter
100+
delete container;
101+
container = nil;
102+
var = nil;
99103
MCExecTypeRelease(value);
100104
}
101105

engine/src/param.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class MCParameter
3939
~MCParameter(void)
4040
{
4141
delete exp;
42+
// AL-2014-09-17: [[ Bug 13465 ]] Delete container when parameter is deleted
43+
delete container;
4244
MCExecTypeRelease(value);
4345
}
4446

engine/src/variable.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,9 +1227,7 @@ MCVarref *MCVariable::newvarref(void)
12271227

12281228
MCContainer::~MCContainer(void)
12291229
{
1230-
if (m_length == 0)
1231-
return;
1232-
1230+
// AL-2014-09-17: [[ Bug 13465 ]] Delete path array regardless of length
12331231
for(uindex_t i = 0; i < m_length; i++)
12341232
MCValueRelease(m_path[i]);
12351233
MCMemoryDeleteArray(m_path);
@@ -1341,6 +1339,7 @@ bool MCContainer::createwithvariable(MCVariable *p_var, MCContainer*& r_containe
13411339
r_container = new MCContainer;
13421340
r_container -> m_variable = p_var;
13431341
r_container -> m_length = 0;
1342+
r_container -> m_path = nil;
13441343
r_container -> m_case_sensitive = false;
13451344
return true;
13461345
}

0 commit comments

Comments
 (0)