mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-30 15:00:21 +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 */
|
#endif /* HAVE_FORK */
|
||||||
|
|
||||||
static void
|
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)
|
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
|
static pid_t
|
||||||
do_spawn (char *exec_file, char **exec_argv, char **exec_env,
|
do_spawn (char *exec_file, char **exec_argv, char **exec_env,
|
||||||
int in, int out, int err, int spawnp)
|
int in, int out, int err, int spawnp)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue