mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-13 19:52:20 +00:00
Fix exec/redirect (fd != 1) in shared-state comsub (re: db72f41f
)
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: https://github.com/ksh93/ksh/issues/128 src/cmd/ksh93/sh/io.c: - Add check for shp->subshare to the OpenSUSE patch. src/cmd/ksh93/tests/io.sh: - Add test.
This commit is contained in:
parent
5529d13d28
commit
fb7551634a
2 changed files with 9 additions and 1 deletions
|
@ -1448,7 +1448,7 @@ int sh_redirect(Shell_t *shp,struct ionod *iop, int flag)
|
||||||
}
|
}
|
||||||
else if(sh_subsavefd(fn))
|
else if(sh_subsavefd(fn))
|
||||||
{
|
{
|
||||||
if(fd==fn)
|
if(fd==fn && !shp->subshare)
|
||||||
{
|
{
|
||||||
if((r=sh_fcntl(fd,F_DUPFD,10)) > 0)
|
if((r=sh_fcntl(fd,F_DUPFD,10)) > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -577,6 +577,14 @@ if [[ -s "$tmp/fdleak.txt" ]]
|
||||||
then exec 3>&-
|
then exec 3>&-
|
||||||
err_exit "Open file descriptor leaks out of subshell"
|
err_exit "Open file descriptor leaks out of subshell"
|
||||||
fi
|
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.
|
# On unpatched ksh on macOS, 'read' used to block when reading from a FIFO and there was no final newline.
|
||||||
|
|
Loading…
Reference in a new issue