mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-29 22:40:34 +02:00
Remove racy optimized file descriptor closing loop in 'spawn'.
This reverts 9332b63240
, thereby
reinstating the performance issue in <https://bugs.gnu.org/59321>.
This optimization was subject to race conditions in multi-threaded code:
new file descriptors could pop up at any time and thus leak in the
child.
* libguile/posix.c (close_inherited_fds): Remove.
(close_inherited_fds_slow): Rename to...
(close_inherited_fds): ... this.
This commit is contained in:
parent
21ad54b694
commit
7d7067fe15
1 changed files with 1 additions and 29 deletions
|
@ -1323,7 +1323,7 @@ SCM_DEFINE (scm_fork, "primitive-fork", 0, 0, 0,
|
|||
#endif /* HAVE_FORK */
|
||||
|
||||
static void
|
||||
close_inherited_fds_slow (posix_spawn_file_actions_t *actions, int max_fd)
|
||||
close_inherited_fds (posix_spawn_file_actions_t *actions, int max_fd)
|
||||
{
|
||||
while (--max_fd > 2)
|
||||
{
|
||||
|
@ -1346,34 +1346,6 @@ close_inherited_fds_slow (posix_spawn_file_actions_t *actions, int max_fd)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
close_inherited_fds (posix_spawn_file_actions_t *actions, int max_fd)
|
||||
{
|
||||
DIR *dirp;
|
||||
struct dirent *d;
|
||||
int fd;
|
||||
|
||||
/* Try to use the platform-specific list of open file descriptors, so
|
||||
we don't need to use the brute force approach. */
|
||||
dirp = opendir ("/proc/self/fd");
|
||||
|
||||
if (dirp == NULL)
|
||||
return close_inherited_fds_slow (actions, max_fd);
|
||||
|
||||
while ((d = readdir (dirp)) != NULL)
|
||||
{
|
||||
fd = atoi (d->d_name);
|
||||
|
||||
/* Skip "." and "..", garbage entries, stdin/stdout/stderr. */
|
||||
if (fd <= 2)
|
||||
continue;
|
||||
|
||||
posix_spawn_file_actions_addclose (actions, fd);
|
||||
}
|
||||
|
||||
closedir (dirp);
|
||||
}
|
||||
|
||||
static pid_t
|
||||
do_spawn (char *exec_file, char **exec_argv, char **exec_env,
|
||||
int in, int out, int err, int spawnp)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue