interp.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:31k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1995-1996 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: interp.n,v 1.9.2.2 2004/10/27 14:23:56 dkf Exp $
  8. '" 
  9. .so man.macros
  10. .TH interp n 7.6 Tcl "Tcl Built-In Commands"
  11. .BS
  12. '" Note:  do not modify the .SH NAME line immediately below!
  13. .SH NAME
  14. interp - Create and manipulate Tcl interpreters
  15. .SH SYNOPSIS
  16. fBinterp fIoption fR?fIarg arg ...fR?
  17. .BE
  18. .SH DESCRIPTION
  19. .PP
  20. This command makes it possible to create one or more new Tcl 
  21. interpreters that co-exist with the creating interpreter in the
  22. same application.  The creating interpreter is called the fImasterfR
  23. and the new interpreter is called a fIslavefR. 
  24. A master can create any number of slaves, and each slave can
  25. itself create additional slaves for which it is master, resulting
  26. in a hierarchy of interpreters.
  27. .PP
  28. Each interpreter is independent from the others: it has its own name
  29. space for commands, procedures, and global variables.
  30. A master interpreter may create connections between its slaves and
  31. itself using a mechanism called an fIaliasfR.  An fIaliasfR is
  32. a command in a slave interpreter which, when invoked, causes a
  33. command to be invoked in its master interpreter or in another slave
  34. interpreter.  The only other connections between interpreters are
  35. through environment variables (the fBenvfR variable), which are
  36. normally shared among all interpreters in the application. Note that the
  37. name space for files (such as the names returned by the fBopenfR command)
  38. is no longer shared between interpreters. Explicit commands are provided to
  39. share files and to transfer references to open files from one interpreter
  40. to another.
  41. .PP
  42. The fBinterpfR command also provides support for fIsafefR
  43. interpreters.  A safe interpreter is a slave whose functions have
  44. been greatly restricted, so that it is safe to execute untrusted
  45. scripts without fear of them damaging other interpreters or the
  46. application's environment. For example, all IO channel creation
  47. commands and subprocess creation commands are made inaccessible to safe
  48. interpreters.
  49. .VS
  50. See fBSAFE INTERPRETERSfR below for more information on
  51. what features are present in a safe interpreter.
  52. The dangerous functionality is not removed from the safe interpreter;
  53. instead, it is fIhiddenfR, so that only trusted interpreters can obtain
  54. access to it. For a detailed explanation of hidden commands, see
  55. fBHIDDEN COMMANDSfR, below.
  56. The alias mechanism can be used for protected communication (analogous to a
  57. kernel call) between a slave interpreter and its master. 
  58. See fBALIAS INVOCATIONfR, below, for more details 
  59. on how the alias mechanism works.
  60. .VE
  61. .PP
  62. A qualified interpreter name is a proper Tcl lists containing a subset of its
  63. ancestors in the interpreter hierarchy, terminated by the string naming the
  64. interpreter in its immediate master. Interpreter names are relative to the
  65. interpreter in which they are used. For example, if fBafR is a slave of
  66. the current interpreter and it has a slave fBa1fR, which in turn has a
  67. slave fBa11fR, the qualified name of fBa11fR in fBafR is the list
  68. fBa1 a11fR.
  69. .PP
  70. The fBinterpfR command, described below, accepts qualified interpreter
  71. names as arguments; the interpreter in which the command is being evaluated
  72. can always be referred to as fB{}fR (the empty list or string). Note that
  73. it is impossible to refer to a master (ancestor) interpreter by name in a
  74. slave interpreter except through aliases. Also, there is no global name by
  75. which one can refer to the first interpreter created in an application.
  76. Both restrictions are motivated by safety concerns.
  77. .SH "THE INTERP COMMAND"
  78. .PP
  79. The fBinterpfR command is used to create, delete, and manipulate
  80. slave interpreters, and to share or transfer
  81. channels between interpreters.  It can have any of several forms, depending
  82. on the fIoptionfR argument:
  83. .TP
  84. fBinterpfR fBaliasfR fIsrcPathfR fIsrcTokenfR
  85. Returns a Tcl list whose elements are the fItargetCmdfR and
  86. fIargfRs associated with the alias represented by fIsrcTokenfR
  87. (this is the value returned when the alias was
  88. created; it is possible that the name of the source command in the
  89. slave is different from fIsrcTokenfR).
  90. .TP
  91. fBinterpfR fBaliasfR fIsrcPathfR fIsrcTokenfR fB{}fR
  92. Deletes the alias for fIsrcTokenfR in the slave interpreter identified by
  93. fIsrcPathfR.
  94. fIsrcTokenfR refers to the value returned when the alias
  95. was created;  if the source command has been renamed, the renamed
  96. command will be deleted.
  97. .TP
  98. fBinterpfR fBaliasfR fIsrcPathfR fIsrcCmdfR fItargetPathfR fItargetCmd fR?fIarg arg ...fR?
  99. This command creates an alias between one slave and another (see the
  100. fBaliasfR slave command below for creating aliases between a slave
  101. and its master).  In this command, either of the slave interpreters
  102. may be anywhere in the hierarchy of interpreters under the interpreter
  103. invoking the command.
  104. fISrcPathfR and fIsrcCmdfR identify the source of the alias.
  105. fISrcPathfR is a Tcl list whose elements select a particular
  106. interpreter.  For example, ``fBa bfR'' identifies an interpreter
  107. fBbfR, which is a slave of interpreter fBafR, which is a slave
  108. of the invoking interpreter.  An empty list specifies the interpreter
  109. invoking the command.  fIsrcCmdfR gives the name of a new
  110. command, which will be created in the source interpreter.
  111. fITargetPathfR and fItargetCmdfR specify a target interpreter
  112. and command, and the fIargfR arguments, if any, specify additional
  113. arguments to fItargetCmdfR which are prepended to any arguments specified
  114. in the invocation of fIsrcCmdfR.
  115. fITargetCmdfR may be undefined at the time of this call, or it may
  116. already exist; it is not created by this command.
  117. The alias arranges for the given target command to be invoked
  118. in the target interpreter whenever the given source command is
  119. invoked in the source interpreter.  See fBALIAS INVOCATIONfR below for
  120. more details. 
  121. The command returns a token that uniquely identifies the command created
  122. fIsrcCmdfR, even if the command is renamed afterwards. The token may but
  123. does not have to be equal to fIsrcCmdfR.
  124. .TP
  125. fBinterpfR fBaliases fR?fIpathfR?
  126. This command returns a Tcl list of the tokens of all the source commands for
  127. aliases defined in the interpreter identified by fIpathfR. The tokens
  128. correspond to the values returned when 
  129. the aliases were created (which may not be the same 
  130. as the current names of the commands).
  131. .TP
  132. fBinterpfR fBcreate fR?fB-safefR? ?fB-|-fR? ?fIpathfR?
  133. Creates a slave interpreter identified by fIpathfR and a new command,
  134. called a fIslave commandfR. The name of the slave command is the last
  135. component of fIpathfR. The new slave interpreter and the slave command
  136. are created in the interpreter identified by the path obtained by removing
  137. the last component from fIpathfR. For example, if fIpath is fBa b
  138. cfR then a new slave interpreter and slave command named fBcfR are
  139. created in the interpreter identified by the path fBa bfR.
  140. The slave command may be used to manipulate the new interpreter as
  141. described below. If fIpathfR is omitted, Tcl creates a unique name of the
  142. form fBinterpfIxfR, where fIxfR is an integer, and uses it for the
  143. interpreter and the slave command. If the fB-safefR switch is specified
  144. (or if the master interpreter is a safe interpreter), the new slave
  145. interpreter will be created as a safe interpreter with limited
  146. functionality; otherwise the slave will include the full set of Tcl
  147. built-in commands and variables. The fB-|-fR switch can be used to
  148. mark the end of switches;  it may be needed if fIpathfR is an unusual
  149. value such as fB-safefR. The result of the command is the name of the
  150. new interpreter. The name of a slave interpreter must be unique among all
  151. the slaves for its master;  an error occurs if a slave interpreter by the
  152. given name already exists in this master.
  153. The initial recursion limit of the slave interpreter is set to the
  154. current recursion limit of its parent interpreter.
  155. .TP
  156. fBinterpfR fBdelete fR?fIpath ...?fR
  157. Deletes zero or more interpreters given by the optional fIpathfR
  158. arguments, and for each interpreter, it also deletes its slaves. The
  159. command also deletes the slave command for each interpreter deleted.
  160. For each fIpathfR argument, if no interpreter by that name
  161. exists, the command raises an error.
  162. .TP
  163. fBinterpfR fBevalfR fIpath arg fR?fIarg ...fR?
  164. This command concatenates all of the fIargfR arguments in the same
  165. fashion as the fBconcatfR command, then evaluates the resulting string as
  166. a Tcl script in the slave interpreter identified by fIpathfR. The result
  167. of this evaluation (including error information such as the fBerrorInfofR
  168. and fBerrorCodefR variables, if an error occurs) is returned to the
  169. invoking interpreter.
  170. Note that the script will be executed in the current context stack frame of the
  171. fIpathfR interpreter; this is so that the implementations (in a master
  172. interpreter) of aliases in a slave interpreter can execute scripts in
  173. the slave that find out information about the slave's current state
  174. and stack frame.
  175. .TP
  176. fBinterp exists fIpathfR
  177. Returns  fB1fR if a slave interpreter by the specified fIpathfR
  178. exists in this master, fB0fR otherwise. If fIpathfR is omitted, the
  179. invoking interpreter is used.
  180. .VS "" BR
  181. .TP
  182. fBinterp expose fIpathfR fIhiddenNamefR ?fIexposedCmdNamefR?
  183. Makes the hidden command fIhiddenNamefR exposed, eventually bringing
  184. it back under a new fIexposedCmdNamefR name (this name is currently
  185. accepted only if it is a valid global name space name without any ::),
  186. in the interpreter
  187. denoted by fIpathfR.
  188. If an exposed command with the targeted name already exists, this command
  189. fails.
  190. Hidden commands are explained in more detail in fBHIDDEN COMMANDSfR, below.
  191. .TP
  192. fBinterpfR fBhidefR fIpathfR fIexposedCmdNamefR ?fIhiddenCmdNamefR?
  193. Makes the exposed command fIexposedCmdNamefR hidden, renaming
  194. it to the hidden command fIhiddenCmdNamefR, or keeping the same name if
  195. fIhiddenCmdNamefR is not given, in the interpreter denoted 
  196. by fIpathfR.
  197. If a hidden command with the targeted name already exists, this command
  198. fails.
  199. Currently both fIexposedCmdNamefR and fIhiddenCmdNamefR can 
  200. not contain namespace qualifiers, or an error is raised.
  201. Commands to be hidden by fBinterp hidefR are looked up in the global
  202. namespace even if the current namespace is not the global one. This
  203. prevents slaves from fooling a master interpreter into hiding the wrong
  204. command, by making the current namespace be different from the global one.
  205. Hidden commands are explained in more detail in fBHIDDEN COMMANDSfR, below.
  206. .TP
  207. fBinterpfR fBhiddenfR fIpathfR
  208. Returns a list of the names of all hidden commands in the interpreter
  209. identified by fIpathfR.
  210. .TP
  211. fBinterpfR fBinvokehiddenfR fIpathfR ?fB-globalfR? fIhiddenCmdNamefR ?fIarg ...fR?
  212. Invokes the hidden command fIhiddenCmdNamefR with the arguments supplied
  213. in the interpreter denoted by fIpathfR. No substitutions or evaluation
  214. are applied to the arguments.
  215. If the fB-globalfR flag is present, the hidden command is invoked at the
  216. global level in the target interpreter; otherwise it is invoked at the
  217. current call frame and can access local variables in that and outer call
  218. frames.
  219. Hidden commands are explained in more detail in fBHIDDEN COMMANDSfR, below.
  220. .VE
  221. .TP
  222. fBinterp issafefR ?fIpathfR?
  223. Returns fB1fR if the interpreter identified by the specified fIpathfR
  224. is safe, fB0fR otherwise.
  225. .VS "" BR
  226. .TP
  227. fBinterp marktrustedfR fIpathfR
  228. Marks the interpreter identified by fIpathfR as trusted. Does
  229. not expose the hidden commands. This command can only be invoked from a
  230. trusted interpreter.
  231. The command has no effect if the interpreter identified by fIpathfR is
  232. already trusted.
  233. .VE
  234. .TP
  235. fBinterpfR fBrecursionlimitfR fIpathfR ?fInewlimitfR?
  236. Returns the maximum allowable nesting depth for the interpreter
  237. specified by fIpathfR.  If fInewlimitfR is specified,
  238. the interpreter recursion limit will be set so that nesting
  239. of more than fInewlimitfR calls to fBTcl_Eval()fR
  240. and related procedures in that interpreter will return an error.
  241. The fInewlimitfR value is also returned.
  242. The fInewlimitfR value must be a positive integer between 1 and the
  243. maximum value of a non-long integer on the platform.  
  244. .sp
  245. The command sets the maximum size of the Tcl call stack only. It cannot
  246. by itself prevent stack overflows on the C stack being used by the
  247. application. If your machine has a limit on the size of the C stack, you
  248. may get stack overflows before reaching the limit set by the command. If
  249. this happens, see if there is a mechanism in your system for increasing
  250. the maximum size of the C stack. 
  251. .TP
  252. fBinterpfR fBsharefR fIsrcPath channelId destPathfR
  253. Causes the IO channel identified by fIchannelIdfR to become shared
  254. between the interpreter identified by fIsrcPathfR and the interpreter
  255. identified by fIdestPathfR. Both interpreters have the same permissions
  256. on the IO channel.
  257. Both interpreters must close it to close the underlying IO channel; IO
  258. channels accessible in an interpreter are automatically closed when an
  259. interpreter is destroyed.
  260. .TP
  261. fBinterpfR fBslavesfR ?fIpathfR?
  262. Returns a Tcl list of the names of all the slave interpreters associated
  263. with the interpreter identified by fIpathfR. If fIpathfR is omitted,
  264. the invoking interpreter is used.
  265. .TP
  266. fBinterpfR fBtargetfR fIpath aliasfR
  267. Returns a Tcl list describing the target interpreter for an alias. The
  268. alias is specified with an interpreter path and source command name, just
  269. as in fBinterp aliasfR above. The name of the target interpreter is
  270. returned as an interpreter path, relative to the invoking interpreter.
  271. If the target interpreter for the alias is the invoking interpreter then an
  272. empty list is returned. If the target interpreter for the alias is not the
  273. invoking interpreter or one of its descendants then an error is generated.
  274. The target command does not have to be defined at the time of this invocation.
  275. .TP
  276. fBinterpfR fBtransferfR fIsrcPath channelId destPathfR
  277. Causes the IO channel identified by fIchannelIdfR to become available in
  278. the interpreter identified by fIdestPathfR and unavailable in the
  279. interpreter identified by fIsrcPathfR.
  280. .SH "SLAVE COMMAND"
  281. .PP
  282. For each slave interpreter created with the fBinterpfR command, a
  283. new Tcl command is created in the master interpreter with the same
  284. name as the new interpreter. This command may be used to invoke
  285. various operations on the interpreter.  It has the following
  286. general form:
  287. .CS
  288. fIslave command fR?fIarg arg ...fR?
  289. .CE
  290. fISlavefR is the name of the interpreter, and fIcommandfR
  291. and the fIargfRs determine the exact behavior of the command.
  292. The valid forms of this command are:
  293. .TP
  294. fIslave fBaliasesfR
  295. Returns a Tcl list whose elements are the tokens of all the
  296. aliases in fIslavefR.  The tokens correspond to the values returned when
  297. the aliases were created (which may not be the same 
  298. as the current names of the commands).
  299. .TP
  300. fIslave fBalias fIsrcTokenfR
  301. Returns a Tcl list whose elements are the fItargetCmdfR and
  302. fIargfRs associated with the alias represented by fIsrcTokenfR
  303. (this is the value returned when the alias was
  304. created; it is possible that the actual source command in the
  305. slave is different from fIsrcTokenfR).
  306. .TP
  307. fIslave fBalias fIsrcToken fB{}fR
  308. Deletes the alias for fIsrcTokenfR in the slave interpreter.
  309. fIsrcTokenfR refers to the value returned when the alias
  310. was created;  if the source command has been renamed, the renamed
  311. command will be deleted.
  312. .TP
  313. fIslave fBalias fIsrcCmd targetCmd fR?fIarg ..fR?
  314. Creates an alias such that whenever fIsrcCmdfR is invoked
  315. in fIslavefR, fItargetCmdfR is invoked in the master.
  316. The fIargfR arguments will be passed to fItargetCmdfR as additional
  317. arguments, prepended before any arguments passed in the invocation of
  318. fIsrcCmdfR.
  319. See fBALIAS INVOCATIONfR below for details.
  320. The command returns a token that uniquely identifies the command created
  321. fIsrcCmdfR, even if the command is renamed afterwards. The token may but
  322. does not have to be equal to fIsrcCmdfR.
  323. .TP
  324. fIslave fBeval fIarg fR?fIarg ..fR?
  325. This command concatenates all of the fIargfR arguments in
  326. the same fashion as the fBconcatfR command, then evaluates
  327. the resulting string as a Tcl script in fIslavefR.
  328. The result of this evaluation (including error information
  329. such as the fBerrorInfofR and fBerrorCodefR variables, if an
  330. error occurs) is returned to the invoking interpreter.
  331. Note that the script will be executed in the current context stack frame
  332. of fIslavefR; this is so that the implementations (in a master
  333. interpreter) of aliases in a slave interpreter can execute scripts in
  334. the slave that find out information about the slave's current state
  335. and stack frame.
  336. .VS "" BR
  337. .TP
  338. fIslave fBexpose fIhiddenName fR?fIexposedCmdNamefR?
  339. This command exposes the hidden command fIhiddenNamefR, eventually bringing
  340. it back under a new fIexposedCmdNamefR name (this name is currently
  341. accepted only if it is a valid global name space name without any ::),
  342. in fIslavefR.
  343. If an exposed command with the targeted name already exists, this command
  344. fails.
  345. For more details on hidden commands, see fBHIDDEN COMMANDSfR, below.
  346. .TP
  347. fIslave fBhide fIexposedCmdNamefR ?fIhiddenCmdNamefR?
  348. This command hides the exposed command fIexposedCmdNamefR, renaming it to 
  349. the hidden command fIhiddenCmdNamefR, or keeping the same name if the
  350. argument is not given, in the fIslavefR interpreter.
  351. If a hidden command with the targeted name already exists, this command
  352. fails.
  353. Currently both fIexposedCmdNamefR and fIhiddenCmdNamefR can 
  354. not contain namespace qualifiers, or an error is raised.
  355. Commands to be hidden are looked up in the global
  356. namespace even if the current namespace is not the global one. This
  357. prevents slaves from fooling a master interpreter into hiding the wrong
  358. command, by making the current namespace be different from the global one.
  359. For more details on hidden commands, see fBHIDDEN COMMANDSfR, below.
  360. .TP
  361. fIslave fBhiddenfR
  362. Returns a list of the names of all hidden commands in fIslavefR.
  363. .TP
  364. fIslave fBinvokehiddenfR ?fB-globalfR fIhiddenName fR?fIarg ..fR?
  365. This command invokes the hidden command fIhiddenNamefR with the
  366. supplied arguments, in fIslavefR. No substitutions or evaluations are
  367. applied to the arguments.
  368. If the fB-globalfR flag is given, the command is invoked at the global
  369. level in the slave; otherwise it is invoked at the current call frame and
  370. can access local variables in that or outer call frames.
  371. For more details on hidden commands,
  372. see fBHIDDEN COMMANDSfR, below.
  373. .VE
  374. .TP
  375. fIslave fBissafefR
  376. Returns  fB1fR if the slave interpreter is safe, fB0fR otherwise.
  377. .VS "" BR
  378. .TP
  379. fIslave fBmarktrustedfR
  380. Marks the slave interpreter as trusted. Can only be invoked by a
  381. trusted interpreter. This command does not expose any hidden
  382. commands in the slave interpreter. The command has no effect if the slave
  383. is already trusted.
  384. .VE
  385. .TP
  386. fIslavefR fBrecursionlimitfR ?fInewlimitfR?
  387. Returns the maximum allowable nesting depth for the fIslavefR interpreter.
  388. If fInewlimitfR is specified, the recursion limit in fIslavefR will be
  389. set so that nesting of more than fInewlimitfR calls to fBTcl_Eval()fR
  390. and related procedures in fIslavefR will return an error.
  391. The fInewlimitfR value is also returned.
  392. The fInewlimitfR value must be a positive integer between 1 and the
  393. maximum value of a non-long integer on the platform.  
  394. .sp
  395. The command sets the maximum size of the Tcl call stack only. It cannot
  396. by itself prevent stack overflows on the C stack being used by the
  397. application. If your machine has a limit on the size of the C stack, you
  398. may get stack overflows before reaching the limit set by the command. If
  399. this happens, see if there is a mechanism in your system for increasing
  400. the maximum size of the C stack. 
  401. .SH "SAFE INTERPRETERS"
  402. .PP
  403. A safe interpreter is one with restricted functionality, so that
  404. is safe to execute an arbitrary script from your worst enemy without
  405. fear of that script damaging the enclosing application or the rest
  406. of your computing environment.  In order to make an interpreter
  407. safe, certain commands and variables are removed from the interpreter.
  408. For example, commands to create files on disk are removed, and the
  409. fBexecfR command is removed, since it could be used to cause damage
  410. through subprocesses.
  411. Limited access to these facilities can be provided, by creating
  412. aliases to the master interpreter which check their arguments carefully
  413. and provide restricted access to a safe subset of facilities.
  414. For example, file creation might be allowed in a particular subdirectory
  415. and subprocess invocation might be allowed for a carefully selected and
  416. fixed set of programs.
  417. .PP
  418. A safe interpreter is created by specifying the fB-safefR switch
  419. to the fBinterp createfR command.  Furthermore, any slave created
  420. by a safe interpreter will also be safe.
  421. .PP
  422. A safe interpreter is created with exactly the following set of
  423. built-in commands:
  424. .DS
  425. .ta 1.2i 2.4i 3.6i
  426. fBafter append array binary
  427. break case catch clock
  428. close concat continue eof
  429. error eval expr fblocked
  430. fcopy fileevent flush for
  431. foreach format gets global
  432. if incr info interp
  433. join lappend lindex linsert
  434. list llength lrange lreplace
  435. lsearch lsort namespace package
  436. pid proc puts read
  437. regexp regsub rename return
  438. scan seek set split
  439. string subst switch tell
  440. time trace unset update
  441. uplevel upvar variable vwait
  442. whilefR
  443. .DE
  444. .VS ""  BR
  445. The following commands are hidden by fBinterp createfR when it
  446. creates a safe interpreter:
  447. .DS
  448. .ta 1.2i 2.4i 3.6i
  449. fBcd encoding exec exit
  450. fconfigure file glob load
  451. open pwd socket sourcefR
  452. .DE
  453. These commands can be recreated later as Tcl procedures or aliases, or
  454. re-exposed by fBinterp exposefR.
  455. .PP
  456. The following commands from Tcl's library of support procedures are
  457. not present in a safe interpreter:
  458. .DS
  459. .ta 1.6i 3.2i
  460. fBauto_exec_ok auto_import auto_load
  461. auto_load_index auto_qualify unknownfR
  462. .DE
  463. Note in particular that safe interpreters have no default fBunknownfR
  464. command, so Tcl's default autoloading facilities are not available.  
  465. Autoload access to Tcl's commands that are normally autoloaded:
  466. .DS
  467. .ta 2.1i
  468. fB
  469. auto_mkindex auto_mkindex_old
  470. auto_reset history
  471. parray pkg_mkIndex
  472. ::pkg::create ::safe::interpAddToAccessPath
  473. ::safe::interpCreate ::safe::interpConfigure
  474. ::safe::interpDelete ::safe::interpFindInAccessPath
  475. ::safe::interpInit ::safe::setLogCmd
  476. tcl_endOfWord tcl_findLibrary
  477. tcl_startOfNextWord tcl_startOfPreviousWord
  478. tcl_wordBreakAfter tcl_wordBreakBeforefR
  479. .DE
  480. can only be provided by explicit definition of an fBunknownfR command
  481. in the safe interpreter.  This will involve exposing the fBsourcefR
  482. command.  This is most easily accomplished by creating the safe interpreter
  483. with Tcl's fBSafe-TclfR mechanism.  fBSafe-TclfR provides safe
  484. versions of fBsourcefR, fBloadfR, and other Tcl commands needed
  485. to support autoloading of commands and the loading of packages.
  486. .VE
  487. .PP
  488. In addition, the fBenvfR variable is not present in a safe interpreter,
  489. so it cannot share environment variables with other interpreters. The
  490. fBenvfR variable poses a security risk, because users can store
  491. sensitive information in an environment variable. For example, the PGP
  492. manual recommends storing the PGP private key protection password in
  493. the environment variable fIPGPPASSfR. Making this variable available
  494. to untrusted code executing in a safe interpreter would incur a
  495. security risk.
  496. .PP
  497. If extensions are loaded into a safe interpreter, they may also restrict
  498. their own functionality to eliminate unsafe commands. For a discussion of
  499. management of extensions for safety see the manual entries for
  500. fBSafe-TclfR and the fBloadfR Tcl command.
  501. .PP
  502. A safe interpreter may not alter the recursion limit of any interpreter,
  503. including itself.
  504. .SH "ALIAS INVOCATION"
  505. .PP
  506. The alias mechanism has been carefully designed so that it can
  507. be used safely when an untrusted script is executing
  508. in a safe slave and the target of the alias is a trusted
  509. master.  The most important thing in guaranteeing safety is to
  510. ensure that information passed from the slave to the master is
  511. never evaluated or substituted in the master;  if this were to
  512. occur, it would enable an evil script in the slave to invoke
  513. arbitrary functions in the master, which would compromise security.
  514. .PP
  515. When the source for an alias is invoked in the slave interpreter, the
  516. usual Tcl substitutions are performed when parsing that command.
  517. These substitutions are carried out in the source interpreter just
  518. as they would be for any other command invoked in that interpreter.
  519. The command procedure for the source command takes its arguments
  520. and merges them with the fItargetCmdfR and fIargfRs for the
  521. alias to create a new array of arguments.  If the words
  522. of fIsrcCmdfR were ``fIsrcCmd arg1 arg2 ... argNfR'',
  523. the new set of words will be
  524. ``fItargetCmd arg arg ... arg arg1 arg2 ... argNfR'',
  525. where fItargetCmdfR and fIargfRs are the values supplied when the
  526. alias was created.  fITargetCmdfR is then used to locate a command
  527. procedure in the target interpreter, and that command procedure
  528. is invoked with the new set of arguments.  An error occurs if
  529. there is no command named fItargetCmdfR in the target interpreter.
  530. No additional substitutions are performed on the words:  the
  531. target command procedure is invoked directly, without
  532. going through the normal Tcl evaluation mechanism.
  533. Substitutions are thus performed on each word exactly once:
  534. fItargetCmdfR and fIargsfR were substituted when parsing the command
  535. that created the alias, and fIarg1 - argNfR are substituted when
  536. the alias's source command is parsed in the source interpreter.
  537. .PP
  538. When writing the fItargetCmdfRs for aliases in safe interpreters,
  539. it is very important that the arguments to that command never be
  540. evaluated or substituted, since this would provide an escape
  541. mechanism whereby the slave interpreter could execute arbitrary
  542. code in the master.  This in turn would compromise the security
  543. of the system.
  544. .VS
  545. .SH "HIDDEN COMMANDS"
  546. .PP
  547. Safe interpreters greatly restrict the functionality available to Tcl
  548. programs executing within them.
  549. Allowing the untrusted Tcl program to have direct access to this
  550. functionality is unsafe, because it can be used for a variety of
  551. attacks on the environment.
  552. However, there are times when there is a legitimate need to use the
  553. dangerous functionality in the context of the safe interpreter. For
  554. example, sometimes a program must be fBsourcefRd into the interpreter.
  555. Another example is Tk, where windows are bound to the hierarchy of windows
  556. for a specific interpreter; some potentially dangerous functions, e.g.
  557. window management, must be performed on these windows within the
  558. interpreter context.
  559. .PP
  560. The fBinterpfR command provides a solution to this problem in the form of
  561. fIhidden commandsfR. Instead of removing the dangerous commands entirely
  562. from a safe interpreter, these commands are hidden so they become
  563. unavailable to Tcl scripts executing in the interpreter. However, such
  564. hidden commands can be invoked by any trusted ancestor of the safe
  565. interpreter, in the context of the safe interpreter, using fBinterp
  566. invokefR. Hidden commands and exposed commands reside in separate name
  567. spaces. It is possible to define a hidden command and an exposed command by
  568. the same name within one interpreter.
  569. .PP
  570. Hidden commands in a slave interpreter can be invoked in the body of
  571. procedures called in the master during alias invocation. For example, an
  572. alias for fBsourcefR could be created in a slave interpreter. When it is
  573. invoked in the slave interpreter, a procedure is called in the master
  574. interpreter to check that the operation is allowable (e.g. it asks to
  575. source a file that the slave interpreter is allowed to access). The
  576. procedure then it invokes the hidden fBsourcefR command in the slave
  577. interpreter to actually source in the contents of the file. Note that two
  578. commands named fBsourcefR exist in the slave interpreter: the alias, and
  579. the hidden command.
  580. .PP
  581. Because a master interpreter may invoke a hidden command as part of
  582. handling an alias invocation, great care must be taken to avoid evaluating
  583. any arguments passed in through the alias invocation.
  584. Otherwise, malicious slave interpreters could cause a trusted master
  585. interpreter to execute dangerous commands on their behalf. See the section
  586. on fBALIAS INVOCATIONfR for a more complete discussion of this topic.
  587. To help avoid this problem, no substitutions or evaluations are
  588. applied to arguments of fBinterp invokehiddenfR.
  589. .PP
  590. Safe interpreters are not allowed to invoke hidden commands in themselves
  591. or in their descendants. This prevents safe slaves from gaining access to
  592. hidden functionality in themselves or their descendants.
  593. .PP
  594. The set of hidden commands in an interpreter can be manipulated by a trusted
  595. interpreter using fBinterp exposefR and fBinterp hidefR. The fBinterp
  596. exposefR command moves a hidden command to the
  597. set of exposed commands in the interpreter identified by fIpathfR,
  598. potentially renaming the command in the process. If an exposed command by
  599. the targeted name already exists, the operation fails. Similarly,
  600. fBinterp hidefR moves an exposed command to the set of hidden commands in
  601. that interpreter. Safe interpreters are not allowed to move commands
  602. between the set of hidden and exposed commands, in either themselves or
  603. their descendants.
  604. .PP
  605. Currently, the names of hidden commands cannot contain namespace
  606. qualifiers, and you must first rename a command in a namespace to the
  607. global namespace before you can hide it.
  608. Commands to be hidden by fBinterp hidefR are looked up in the global
  609. namespace even if the current namespace is not the global one. This
  610. prevents slaves from fooling a master interpreter into hiding the wrong
  611. command, by making the current namespace be different from the global one.
  612. .VE
  613. .SH CREDITS
  614. .PP
  615. This mechanism is based on the Safe-Tcl prototype implemented
  616. by Nathaniel Borenstein and Marshall Rose.
  617. .SH EXAMPLES
  618. Creating and using an alias for a command in the current interpreter:
  619. .CS
  620. fBinterp aliasfR {} getIndex {} lsearch {alpha beta gamma delta}
  621. set idx [getIndex delta]
  622. .CE
  623. .PP
  624. Executing an arbitrary command in a safe interpreter where every
  625. invokation of fBlappendfR is logged:
  626. .CS
  627. set i [fBinterp createfR -safe]
  628. fBinterp hidefR $i lappend
  629. fBinterp aliasfR $i lappend {} loggedLappend $i
  630. proc loggedLappend {i args} {
  631.    puts "logged invokation of lappend $args"
  632.    # Be extremely careful about command construction
  633.    eval [linsert $args 0 \
  634.          fBinterp invokehiddenfR $i lappend]
  635. }
  636. fBinterp evalfR $i $someUntrustedScript
  637. .CE
  638. .SH "SEE ALSO"
  639. load(n), safe(n), Tcl_CreateSlave(3)
  640. .SH KEYWORDS
  641. alias, master interpreter, safe interpreter, slave interpreter