Skip to content

Commit

Permalink
Fix set +r so that it cannot unset the restricted option
Browse files Browse the repository at this point in the history
The ksh man page documents that the restricted option cannot be
unset once it is set, which means `set +r` should be invalid.
While this was true for `set +o restricted`, `set +r` was causing
the restricted option to be unset. The fix for this problem comes
from one of Solaris' patches, which adds an error check to prevent
this behavior.

Solaris' patch:
https://github.com/oracle/solaris-userland/blob/master/components/ksh93/patches/020-CR6919590.patch

src/cmd/ksh93/sh/args.c:
 - Add an error check to stop `set +r` from unsetting the
   restricted option.

src/cmd/ksh93/tests/restricted.sh:
 - Add two regression tests to make sure the restricted option
   cannot be unset.

(cherry picked from commit bef4fee404d8e24b38fce66420c14a39ac4a123e)
  • Loading branch information
JohnoKing authored and McDutchie committed Jun 11, 2020
1 parent 9cef2d5 commit 74b4162
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/cmd/ksh93/sh/args.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions src/cmd/ksh93/tests/restricted.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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))

0 comments on commit 74b4162

Please sign in to comment.