summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorapnadkarni <apnmbx-wits@yahoo.com>2023-07-11 11:35:01 (GMT)
committerapnadkarni <apnmbx-wits@yahoo.com>2023-07-11 11:35:01 (GMT)
commitf7429e323099dee3d15b340936276850974dbbe7 (patch)
tree8330fa7a0f651f24b260cc00144eb80327867dea
parent7aa511f93b41b7f368922dc00dd94f1919bdaa63 (diff)
downloadtcl-f7429e323099dee3d15b340936276850974dbbe7.zip
tcl-f7429e323099dee3d15b340936276850974dbbe7.tar.gz
tcl-f7429e323099dee3d15b340936276850974dbbe7.tar.bz2
Prevent foreach memory bloat iterating within a proc
-rw-r--r--generic/tclExecute.c16
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];