diff options
author | apnadkarni <apnmbx-wits@yahoo.com> | 2023-07-11 11:35:01 (GMT) |
---|---|---|
committer | apnadkarni <apnmbx-wits@yahoo.com> | 2023-07-11 11:35:01 (GMT) |
commit | f7429e323099dee3d15b340936276850974dbbe7 (patch) | |
tree | 8330fa7a0f651f24b260cc00144eb80327867dea | |
parent | 7aa511f93b41b7f368922dc00dd94f1919bdaa63 (diff) | |
download | tcl-f7429e323099dee3d15b340936276850974dbbe7.zip tcl-f7429e323099dee3d15b340936276850974dbbe7.tar.gz tcl-f7429e323099dee3d15b340936276850974dbbe7.tar.bz2 |
Prevent foreach memory bloat iterating within a proc
-rw-r--r-- | generic/tclExecute.c | 16 |
1 files 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]; |