diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-01-13 13:27:46 -0500 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-01-13 13:27:46 -0500 |
commit | cfa28e560ef69372b9e15e9a2d924a0fbcfc7bca (patch) | |
tree | 21155ae0a762cd0cc6d173622c5aa9fc682f9ef1 | |
parent | 1086d70d916fd0eb969b3d89ff88abd35f6a5c34 (diff) | |
download | glibc-cfa28e560ef69372b9e15e9a2d924a0fbcfc7bca.tar.gz glibc-cfa28e560ef69372b9e15e9a2d924a0fbcfc7bca.tar.xz glibc-cfa28e560ef69372b9e15e9a2d924a0fbcfc7bca.zip |
Relax requirement on close in child created by posix_spawn.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | sysdeps/posix/spawni.c | 20 |
2 files changed, 20 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index 3035d3dbfb..f477fed328 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2011-01-13 Ulrich Drepper <drepper@gmail.com> + * sysdeps/posix/spawni.c (__spawni): Don't fail if close file action + in child fails because the descriptor is already closed. + [BZ #12397] * sysdeps/unix/sysv/linux/mkdirat.c (mkdirat): Fix handling of missing syscall. diff --git a/sysdeps/posix/spawni.c b/sysdeps/posix/spawni.c index 29803a8461..c5a827d6d7 100644 --- a/sysdeps/posix/spawni.c +++ b/sysdeps/posix/spawni.c @@ -1,5 +1,5 @@ /* Guts of POSIX spawn interface. Generic POSIX.1 version. - Copyright (C) 2000-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2000-2005, 2006, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,6 +24,7 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <sys/resource.h> #include "spawn_int.h" #include <not-cancel.h> #include <local-setxid.h> @@ -164,6 +165,8 @@ __spawni (pid_t *pid, const char *file, if (file_actions != NULL) { int cnt; + struct rlimit64 fdlimit; + bool have_fdlimit = false; for (cnt = 0; cnt < file_actions->__used; ++cnt) { @@ -173,8 +176,19 @@ __spawni (pid_t *pid, const char *file, { case spawn_do_close: if (close_not_cancel (action->action.close_action.fd) != 0) - /* Signal the error. */ - _exit (SPAWN_ERROR); + { + if (! have_fdlimit) + { + getrlimit64 (RLIMIT_NOFILE, &fdlimit); + have_fdlimit = true; + } + + /* Only signal errors for file descriptors out of range. */ + if (action->action.close_action.fd < 0 + || action->action.close_action.fd >= fdlimit.rlim_cur) + /* Signal the error. */ + _exit (SPAWN_ERROR); + } break; case spawn_do_open: |