Skip to content

Commit

Permalink
-o posix: allow invoked programs to inherit FDs > 2
Browse files Browse the repository at this point in the history
If there are file descriptors > 2 opened with 'exec' or 'redirect',
ksh93 has always closed them when invoking another pogram. This is
contrary to POSIX which states:
    Utilities other than the special built-ins […] shall be invoked
    in a separate environment that consists of the following. The
    initial value of these objects shall be the same as that for
    the parent shell, except as noted below.
    * Open files inherited on invocation of the shell, open files
      controlled by the exec special built-in plus any
      modifications, and additions specified by any redirections to
      the utility
    * […]
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_12

src/cmd/ksh93/sh/io.c: sh_redirect():
- When flag==2, do not close FDs > 2 if POSIX mode is active.

src/cmd/ksh93/tests/io.sh:
- Regress-test inheriting FD 7 with and without POSIX mode.

src/cmd/ksh93/sh.1:
- Update.
  • Loading branch information
McDutchie committed Sep 1, 2020
1 parent b301d41 commit fd97738
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 2 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Any uppercase BUG_* names are modernish shell bug IDs.
* disables the &> redirection shorthand
* causes the 'let' arithmetic command to recognise octal numbers by
leading zeros regardless of the setting of the 'letoctal' option
* causes file descriptors > 2 to be left open when invoking another program

2020-08-19:

Expand Down
4 changes: 3 additions & 1 deletion src/cmd/ksh93/sh.1
Original file line number Diff line number Diff line change
Expand Up @@ -6817,7 +6817,8 @@ command.
Any file descriptor numbers greater than
.B 2
that are opened with this mechanism are closed when invoking another program,
unless explicitly redirected to themselves as part of that invocation.
unless they are explicitly redirected to themselves as part of that invocation
(e.g. \fb4>&4\fR) or the \fBposix\fR shell option is active.
.TP
\(dg \f3return\fP \*(OK \f2n\^\fP \*(CK
Causes a shell
Expand Down Expand Up @@ -7038,6 +7039,7 @@ to fail or zero if no command has failed.
.B posix
Enable POSIX standard compatibility mode. This option
is on by default if ksh is invoked as \fBsh\fR. It
causes file descriptors > 2 to be left open when invoking another program,
enables octal numbers in \fBlet\fR shell arithmetic (see \fBletoctal\fR), and
disables the \fB&>\fR redirection shorthand.
.TP 8
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/ksh93/sh/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1094,7 +1094,7 @@ int sh_redirect(Shell_t *shp,struct ionod *iop, int flag)
Namval_t *np=0;
int isstring = shp->subshell?(sfset(sfstdout,0,0)&SF_STRING):0;

if(flag==2)
if(flag==2 && !sh_isoption(SH_POSIX))
clexec = 1;
if(iop)
traceon = sh_trace(shp,NIL(char**),0);
Expand Down
8 changes: 8 additions & 0 deletions src/cmd/ksh93/tests/io.sh
Original file line number Diff line number Diff line change
Expand Up @@ -616,5 +616,13 @@ then set -o posix
[[ $(< aha2.txt) == ok2 ]] || err_exit '&> does not redirect stderr'
fi
# In POSIX mode, file descriptors > 2 should remain open when invoking another proram
if [[ -o ?posix ]]
then (set -o posix; exec 7>ok.txt; "$SHELL" -c 'print ok >&7' 2>/dev/null)
[[ $(<ok.txt) == ok ]] || err_exit 'File descriptors > 2 not inherited in POSIX mode'
fi
(exec 7>bad.txt; "$SHELL" -c 'print bad >&7' 2>/dev/null)
[[ $(<bad.txt) == '' ]] || err_exit 'File descriptors > 2 inherited without POSIX mode' "(got $actual)"
# ======
exit $((Errors<125?Errors:125))

0 comments on commit fd97738

Please sign in to comment.