summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2023-08-03 20:00:01 (GMT)
committerdgp <dgp@users.sourceforge.net>2023-08-03 20:00:01 (GMT)
commitb87eac8cd9d8428556df026871dbf555e6c29aec (patch)
treeecbdb0d222a1ee7fce4e34bba77b67b386bdfc0b /generic/tclExecute.c
parent89cc07aa343a80a7728cb114b9d15added767719 (diff)
downloadtcl-b87eac8cd9d8428556df026871dbf555e6c29aec.zip
tcl-b87eac8cd9d8428556df026871dbf555e6c29aec.tar.gz
tcl-b87eac8cd9d8428556df026871dbf555e6c29aec.tar.bz2
Add DECACHE/CACHE_STACK_INFO() protections to calls out of the bytecode
execution engine to avoid panics from corrupted execution stack.
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 097c60e..7e7b1f9 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -3377,8 +3377,12 @@ TEBCresume(
goto gotError;
}
if (Tcl_IsShared(objResultPtr)) {
- Tcl_Obj *newValue = TclDuplicatePureObj(
- interp, objResultPtr, &tclListType);
+ Tcl_Obj *newValue;
+
+ DECACHE_STACK_INFO();
+ newValue = TclDuplicatePureObj(interp, objResultPtr, &tclListType);
+ CACHE_STACK_INFO();
+
if (!newValue) {
TRACE_ERROR(interp);
goto gotError;
@@ -3441,8 +3445,10 @@ TEBCresume(
goto gotError;
} else {
if (Tcl_IsShared(objResultPtr)) {
+ DECACHE_STACK_INFO();
valueToAssign = TclDuplicatePureObj(
interp, objResultPtr, &tclListType);
+ CACHE_STACK_INFO();
if (!valueToAssign) {
goto errorInLappendListPtr;
}
@@ -6462,10 +6468,11 @@ TEBCresume(
i, O2S(listPtr), O2S(Tcl_GetObjResult(interp))));
goto gotError;
}
- CACHE_STACK_INFO();
if (Tcl_IsShared(listPtr)) {
+ DECACHE_STACK_INFO();
objPtr = TclDuplicatePureObj(
interp, listPtr, &tclListType);
+ CACHE_STACK_INFO();
if (!objPtr) {
goto gotError;
}