Module Name: src Committed By: kre Date: Wed Sep 15 18:29:45 UTC 2021
Modified Files: src/bin/sh: main.c parser.c redir.c redir.h Log Message: Improve the solution for the 2nd access to a fd which shouldn't be available ("13") issue reported by Jan Schaumann on netbsd-users. This fixes a bug in the earlier fix (a day or so ago) which could allow the shell's idea of which fd range was in use by the script to get wildly incorrect, but now also actually looks to see which fd's are in use as renamed other user fd's during the lifetime of a redirection which needs to be able to be undone (most redirections occur after a fork and are permanent in the child process). Attempting to access such a fd (as with attempts to access a fd in use by the shell for its own purposes) is treated as an attempt to access a closed fd (EBADF). Attempting to reuse the fd for some other purpose (which should be rare, even for scripts attempting to cause problems, since the shell generally knows which fds the script wants to use, and avoids them) will cause the renamed (renumbered) fd to be renamed again (moved aside to some other available fd), just as happens with the shell's private fds. Also, when a generic fd is required, don't give up because of EMFILE or similar unless there are no available fds at all (we might prefer >10 or bigger, but if there are none there, use anything). This avoids redirection errors when ulimit -n has been set small, and all the fds >10 that are available have been used, but we need somewhere to park the old user of a fd while we reuse that fd for the redirection. To generate a diff of this commit: cvs rdiff -u -r1.85 -r1.86 src/bin/sh/main.c cvs rdiff -u -r1.173 -r1.174 src/bin/sh/parser.c cvs rdiff -u -r1.67 -r1.68 src/bin/sh/redir.c cvs rdiff -u -r1.25 -r1.26 src/bin/sh/redir.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.