diff --git a/src/cmd/ksh93/sh/args.c b/src/cmd/ksh93/sh/args.c index a4a11012d..70bcabea6 100644 --- a/src/cmd/ksh93/sh/args.c +++ b/src/cmd/ksh93/sh/args.c @@ -302,6 +302,8 @@ int sh_argopts(int argc,register char *argv[], void *context) } else { + if ((o == SH_RESTRICTED) && sh_isoption(SH_RESTRICTED)) + errormsg(SH_DICT,ERROR_exit(1),e_restricted,"r"); /* set -r cannot be unset */ if(o==SH_XTRACE) trace = 0; off_option(&newflags,o); diff --git a/src/cmd/ksh93/tests/restricted.sh b/src/cmd/ksh93/tests/restricted.sh index abf33cc82..eb32c01bb 100755 --- a/src/cmd/ksh93/tests/restricted.sh +++ b/src/cmd/ksh93/tests/restricted.sh @@ -87,4 +87,10 @@ for i in PATH ENV FPATH do check_restricted "function foo { typeset $i=foobar;};foo" || err_exit "$i can be changed in function by using typeset" done +# ====== +# `set +r` and `set +o restricted` should not unset the restricted option +check_restricted 'set +r' 2> /dev/null || err_exit '`set +r` unsets the restricted option' +check_restricted 'set +o restricted' 2> /dev/null || err_exit '`set +o restricted` unsets the restricted option' + +# ====== exit $((Errors<125?Errors:125))