s [read $F] close $F $slave eval $Contents } #################### End of Procedures ################## # main # Process argv input: set scriptname [lindex $argv 0] set security_level [lindex $argv 1] if {$security_level != 0 && $security_level != 1} { set security_level 1 } #Set Security level specific parameters set errorInfo "" set FM_TCLLIBDIR [info library] if {$security_level == 1} { #untrusted script interp create -safe slave interp share {} stdin slave interp share {} stdout slave interp share {} stderr slave lappend global_vars auto_path lappend global_vars auto_oldpath lappend global_vars tcl_library foreach entry [info vars] { if [array exists $entry] { continue } if {[lsearch -exact $global_vars $entry] >= 0} { continue; } TraceVariable {} $entry slave $entry } # uncomment to debug safe.tcl #::safe::setLogCmd puts stderr ::safe::interpInit slave # Hidden commands that are exposed to slave to ease restrictions. interp alias slave exit {} exit interp expose slave fconfigure interp expose slave socket interp eval slave {load {} tbcload} eval_script slave $scriptname close stdin close stdout close stderr ::safe::interpDelete slave } else { #trusted script interp create slave interp share {} stdin slave interp share {} stdout slave interp share {} stderr slave foreach entry [info vars] { if [array exists $entry] { continue } TraceVariable {} $entry slave $entry } if {[catch {::interp eval slave\ {source [file join $FM_TCLLIBDIR init.tcl]}} msg]} { error "can't source init.tcl into slave ($msg)" } interp eval slave {load {} tbcload} eval_script slave $scriptname interp delete slave }