mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Re-enable SHOPT_DEVFD, fixing process substitution fd leaks (#218)
This commit fixes a long-standing bug (present since at least ksh93r) that caused a file descriptor leak when passing a process substitution to a function, or (if compiled with SHOPT_SPAWN) to a nonexistent command. The leaks only occurred when ksh was compiled with SHOPT_DEVFD; the FIFO method was unaffected. src/cmd/ksh93/sh/xec.c: sh_exec(): - When a process substitution is passed to a built-in, the remaining file descriptor is closed with sh_iorestore. Do the same thing when passing a process substitution to a function. This is done by delaying the sh_iorestore() call to 'setexit:' where both built-ins and functions terminate and set the exit status ($?). This means that call now will not be executed if a longjmp is done, e.g. due to an error in a special built-in. However, there is already another sh_iorestore() call in main.c, exfile(), line 418, that handles that scenario. - sh_ntfork() can fail, so rather than assume it will succeed, handle a failure by closing extra file descriptors with sh_iorestore(). This fixes the leak on command not found with SHOPT_SPAWN. src/cmd/ksh93/include/defs.h: - Since the file descriptor leaks are now fixed, remove the workaround that forced ksh to use the FIFO method. src/cmd/ksh93/SHOPT.sh: - Add SHOPT_DEVFD as a configurable option (default: probe). src/cmd/ksh93/tests/io.sh: - Add a regression test for the 'not found' file descriptor leak. - Add a test to ensure it keeps working with 'command'. Fixes: https://github.com/ksh93/ksh/issues/67
This commit is contained in:
parent
d2c1700f63
commit
6d63b57dd3
7 changed files with 35 additions and 17 deletions
|
|
@ -43,14 +43,6 @@
|
|||
# define mbmax() 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Until a file descriptor leak with process substitution
|
||||
* is fixed, disable /dev/fd use to avoid the problem.
|
||||
* https://github.com/ksh93/ksh/issues/67
|
||||
*/
|
||||
#undef SHOPT_DEVFD
|
||||
#define SHOPT_DEVFD 0
|
||||
|
||||
#include <sfio.h>
|
||||
#include <error.h>
|
||||
#include "FEATURE/externs"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue