From f7429e323099dee3d15b340936276850974dbbe7 Mon Sep 17 00:00:00 2001 From: apnadkarni Date: Tue, 11 Jul 2023 11:35:01 +0000 Subject: Prevent foreach memory bloat iterating within a proc --- generic/tclExecute.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 120dac6..b74c74a 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -6424,7 +6424,7 @@ TEBCresume( { ForeachInfo *infoPtr; - Tcl_Obj *listPtr, **elements; + Tcl_Obj *listPtr; ForeachVarList *varListPtr; Tcl_Size numLists, listLen, numVars, listTmpDepth; Tcl_Size iterNum, iterMax, iterTmp; @@ -6540,8 +6540,7 @@ TEBCresume( listPtr = OBJ_AT_DEPTH(listTmpDepth); DECACHE_STACK_INFO(); - status = TclListObjGetElementsM( - interp, listPtr, &listLen, &elements); + status = Tcl_ListObjLength(interp, listPtr, &listLen); if (status != TCL_OK) { CACHE_STACK_INFO(); goto gotError; @@ -6554,7 +6553,16 @@ TEBCresume( if (valIndex >= listLen) { TclNewObj(valuePtr); } else { - valuePtr = elements[valIndex]; + status = Tcl_ListObjIndex( + interp, listPtr, valIndex, &valuePtr); + if (status != TCL_OK) { + /* Could happen for abstract lists */ + goto gotError; + } + if (valuePtr == NULL) { + /* Permitted for Tcl_LOI to return NULL */ + TclNewObj(valuePtr); + } } varIndex = varListPtr->varIndexes[j]; -- cgit v0.12