Roland Mainz wrote:
> Is there a way in ksh93 to switch to  "restricted" (=rksh) mode during
> runtime of the shell ?
> The idea is to switch to "restricted" within a suub-shell when
> processing some user input...
> 
> I tried "set -o restricted" to switch to "restricted" mode but that
> fails like this:
> -- snip --
> % ksh -c 'true ; (set -o restricted ; echo "foo" ; exec >/blabla) ;
> true'
> ksh[1]: set: restricted: bad option(s)
> Usage: set [-sabefhkmnptuvxBCGH] [-A name] [-o[option]] [arg ...]
> -- snip --
> 
> Is there any other way ?

It seems there is no way...
... attached is a small patch
("ksh93_libshell_set_restricted_mode_once_001.diff.txt") for libshell
which gets this working. The patch allows someone to turn on the
"restricted" mode in a one-way fashion, e.g. it is not possible to
disable it anymore (which could be a security hole) once it was enabled.

Test output then looks like this:
-- snip --
% ./ksh -c 'set -x ; echo "start" ; cd . ; (echo "mark 1" ; set -o
restricted ; cd .) ; echo "mark2" ; (set -o restricted ; echo "mark4" ;
set -o restricted=0) ; echo "mark5"')
+ echo start
start
+ cd .
+ echo 'mark 1'
mark 1
+ set -o restricted
+ cd .
../../cmd/ksh/i386/ksh[1]: cd: restricted
+ echo mark2
mark2
+ set -o restricted
+ echo mark4
mark4
../../cmd/ksh/i386/ksh[1]: set: restricted=0: bad option(s)
Usage: set [-sabefhkmnptuvxBCGH] [-A name] [-o[option]] [arg ...]
+ echo mark5
mark5
-- snip --

David/Glenn:
Is there still time to get this functionality into ksh93r+ ? It may be
very usefull for the |wordexp()| work on Solaris and some other stuff,
too...

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) roland.mainz at nrubsig.org
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 7950090
 (;O/ \/ \O;)
-------------- next part --------------
Index: common/include/defs.h
===================================================================
--- common/include/defs.h       (revision 269)
+++ common/include/defs.h       (working copy)
@@ -229,6 +229,7 @@
 #define SH_COMMANDLINE         0x100
 #define SH_BASHEXTRA           0x200
 #define SH_BASHOPT             0x400
+#define SH_SETONONLY           0x800 /* disallow setting the flag to "off" */
 
 #if SHOPT_BASH
 #   ifndef SHOPT_HISTEXPAND
Index: common/data/options.c
===================================================================
--- common/data/options.c       (revision 269)
+++ common/data/options.c       (working copy)
@@ -98,7 +98,7 @@
        bashopt("progcomp",             SH_PROGCOMP)
        bashopt("promptvars",           SH_PROMPTVARS)
        "rc",                           SH_RC|SH_COMMANDLINE,
-       "restricted",                   SH_RESTRICTED|SH_COMMANDLINE,
+       "restricted",                   SH_RESTRICTED|SH_SETONONLY,
        bashopt("restricted_shell",     SH_RESTRICTED2|SH_COMMANDLINE)
        bashopt("shift_verbose",        SH_SHIFT_VERBOSE)
        bashopt("sourcepath",           SH_SOURCEPATH)
Index: common/sh/args.c
===================================================================
--- common/sh/args.c    (revision 269)
+++ common/sh/args.c    (working copy)
@@ -189,7 +189,8 @@
                        if(o<=0
                                || (!sh_isoption(SH_BASH) && (o&SH_BASHEXTRA))
                                || ((!sh_isoption(SH_BASH) || n=='o') && 
(o&SH_BASHOPT))
-                               || (setflag && (o&SH_COMMANDLINE)))
+                               || (setflag && (o&SH_COMMANDLINE))
+                               || (setflag && (f == 0) && (o&SH_SETONONLY)))
                        {
                                errormsg(SH_DICT,2, e_option, opt_info.arg);
                                error_info.errors++;

Reply via email to