Skip to content

Commit

Permalink
Fix exec/redirect (fd != 1) in shared-state comsub (re: db72f41)
Browse files Browse the repository at this point in the history
That OpenSUSE patch introduced a bug: file descriptors other than 1
that were globally redirected using 'exec' or 'redirect' no longer
survived a ${ shared-state; } command substitution.

Related: #128

src/cmd/ksh93/sh/io.c:
- Add check for shp->subshare to the OpenSUSE patch.

src/cmd/ksh93/tests/io.sh:
- Add test.
  • Loading branch information
McDutchie committed Feb 13, 2021
1 parent 5529d13 commit fb75516
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/cmd/ksh93/sh/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1448,7 +1448,7 @@ int sh_redirect(Shell_t *shp,struct ionod *iop, int flag)
}
else if(sh_subsavefd(fn))
{
if(fd==fn)
if(fd==fn && !shp->subshare)
{
if((r=sh_fcntl(fd,F_DUPFD,10)) > 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 @@ -577,6 +577,14 @@ if [[ -s "$tmp/fdleak.txt" ]]
then exec 3>&-
err_exit "Open file descriptor leaks out of subshell"
fi
# However, it should still survive a shared-state command sustitution if it's not 1 (stdout).
redirect 3>&- # close FD 3 just in case
: ${ redirect 3>"$tmp/fdshared.txt"; }
{ echo good >&3; } 2>/dev/null
if [[ ! -s "$tmp/fdshared.txt" ]]
then err_exit "Open file descriptor does not survive shared-state command substitution"
fi
redirect 3>&-
# ======
# On unpatched ksh on macOS, 'read' used to block when reading from a FIFO and there was no final newline.
Expand Down

0 comments on commit fb75516

Please sign in to comment.