From dfedf71b9665ba3badc0ff25fc2f68344327e8e6 Mon Sep 17 00:00:00 2001 From: sebres Date: Thu, 13 Jun 2024 14:37:30 +0000 Subject: test illustrating [1095bf7f756f9aed]: safe ensemble commands must be compiled in safe interp --- tests/namespace.test | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/namespace.test b/tests/namespace.test index 08531e4..712c0e5 100644 --- a/tests/namespace.test +++ b/tests/namespace.test @@ -3294,6 +3294,22 @@ test namespace-55.1 {compiled ensembles inside compiled ensembles: Bug 6d2f249a0 info class [format %s constructor] oo::object } "" +test namespace-55.2 {compiled ensembles inside safe interpreters (for safe sub-commands), bug [1095bf7f756f9aed]} -setup { + interp create -safe si + set code { + proc test_comp_dict d { dict for {k v} $d {expr $v} } + regexp -inline {Command 1:(?:[^\n]*\n){1,5}} [::tcl::unsupported::disassemble proc test_comp_dict] + } +} -body { + set a [ eval $code] + set b [si eval $code] + list [expr {$a eq $b}] [regexp { dictFirst } $a] [regexp { dictFirst } $b] $a $b +} -cleanup { + rename test_comp_dict {} + unset -nocomplain a b + interp delete si +} -match glob -result {1 1 1 *} + test namespace-56.1 {bug f97d4ee020: mutually-entangled deletion} { namespace eval ::testing { proc abc {} {} -- cgit v0.12 From 55a7124c0d9a4a2fc9d149b1cf305deec69f4a56 Mon Sep 17 00:00:00 2001 From: sebres Date: Thu, 13 Jun 2024 14:39:03 +0000 Subject: fixes [1095bf7f756f9aed]: safe ensemble commands will be compiled now in safe interp too --- generic/tclEnsemble.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index dea3bed..367a4e5 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -1615,6 +1615,8 @@ TclMakeEnsemble( Tcl_DStringAppend(&hiddenBuf, map[i].name, -1))) { Tcl_Panic("%s", Tcl_GetString(Tcl_GetObjResult(interp))); } + /* don't compile unsafe subcommands in unsafe interp */ + cmdPtr->compileProc = NULL; } else { /* * Not hidden, so just create it. Yay! @@ -1624,8 +1626,8 @@ TclMakeEnsemble( Tcl_NRCreateCommand(interp, TclGetString(toObj), map[i].proc, map[i].nreProc, map[i].clientData, NULL); + cmdPtr->compileProc = map[i].compileProc; } - cmdPtr->compileProc = map[i].compileProc; } } Tcl_SetEnsembleMappingDict(interp, ensemble, mapDict); @@ -3107,7 +3109,7 @@ TclCompileEnsemble( Tcl_IncrRefCount(targetCmdObj); newCmdPtr = (Command *) Tcl_GetCommandFromObj(interp, targetCmdObj); TclDecrRefCount(targetCmdObj); - if (newCmdPtr == NULL || Tcl_IsSafe(interp) + if (newCmdPtr == NULL || (Tcl_IsSafe(interp) && !cmdPtr->compileProc) || newCmdPtr->nsPtr->flags & NS_SUPPRESS_COMPILATION || newCmdPtr->flags & CMD_HAS_EXEC_TRACES || ((Interp *)interp)->flags & DONT_COMPILE_CMDS_INLINE) { @@ -3115,7 +3117,6 @@ TclCompileEnsemble( * Maps to an undefined command or a command without a compiler. * Cannot compile. */ - goto cleanup; } cmdPtr = newCmdPtr; -- cgit v0.12 From 3466ac8aec7d4e384c2400d159ac4db75b17cfff Mon Sep 17 00:00:00 2001 From: sebres Date: Thu, 13 Jun 2024 16:00:41 +0000 Subject: small amend cleaning var in test --- tests/namespace.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/namespace.test b/tests/namespace.test index 712c0e5..17c9438 100644 --- a/tests/namespace.test +++ b/tests/namespace.test @@ -3306,7 +3306,7 @@ test namespace-55.2 {compiled ensembles inside safe interpreters (for safe sub-c list [expr {$a eq $b}] [regexp { dictFirst } $a] [regexp { dictFirst } $b] $a $b } -cleanup { rename test_comp_dict {} - unset -nocomplain a b + unset -nocomplain code a b interp delete si } -match glob -result {1 1 1 *} -- cgit v0.12 From 481ffd9b4e3e5c6853e2a4c4d36b55f64df34e6f Mon Sep 17 00:00:00 2001 From: sebres Date: Thu, 13 Jun 2024 16:13:22 +0000 Subject: typo in comment --- generic/tclEnsemble.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index 367a4e5..6e16a6a 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -1615,7 +1615,7 @@ TclMakeEnsemble( Tcl_DStringAppend(&hiddenBuf, map[i].name, -1))) { Tcl_Panic("%s", Tcl_GetString(Tcl_GetObjResult(interp))); } - /* don't compile unsafe subcommands in unsafe interp */ + /* don't compile unsafe subcommands in safe interp */ cmdPtr->compileProc = NULL; } else { /* -- cgit v0.12