diff options
author | dgp <dgp@users.sourceforge.net> | 2023-08-03 20:00:01 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2023-08-03 20:00:01 (GMT) |
commit | b87eac8cd9d8428556df026871dbf555e6c29aec (patch) | |
tree | ecbdb0d222a1ee7fce4e34bba77b67b386bdfc0b /generic/tclExecute.c | |
parent | 89cc07aa343a80a7728cb114b9d15added767719 (diff) | |
download | tcl-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.c | 13 |
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; } |