[PATCH v3] posix: spawn: Make handling of invalid fds consistent
Lucas Chollet
lucas.chollet@free.fr
Thu Mar 26 14:13:09 GMT 2026
in `posix_spawn_file_actions_*` functions.
As mandated by POSIX, these functions should return `EBADF` on negative
file descriptors but let everything else fail during the call to
`posix_spawn`.
Signed-off-by: Lucas Chollet <lucas.chollet@free.fr>
---
v3: Make all spawn_faction routines consistent with regards to invalid
fd handling.
posix/Makefile | 1 -
posix/spawn_faction_addclose.c | 2 +-
posix/spawn_faction_addclosefrom.c | 2 +-
posix/spawn_faction_adddup2.c | 2 +-
posix/spawn_faction_addfchdir.c | 3 +++
posix/spawn_faction_addopen.c | 2 +-
posix/spawn_faction_addtcsetpgrp_np.c | 2 +-
posix/spawn_int.h | 4 ----
posix/spawn_valid_fd.c | 30 ---------------------------
posix/tst-posix_spawn-fd.c | 2 +-
10 files changed, 9 insertions(+), 41 deletions(-)
delete mode 100644 posix/spawn_valid_fd.c
diff --git a/posix/Makefile b/posix/Makefile
index ec28b9e1da..bf5d5a8e23 100644
--- a/posix/Makefile
+++ b/posix/Makefile
@@ -155,7 +155,6 @@ routines := \
spawn_faction_addtcsetpgrp_np \
spawn_faction_destroy \
spawn_faction_init \
- spawn_valid_fd \
spawnattr_destroy \
spawnattr_getdefault \
spawnattr_getflags \
diff --git a/posix/spawn_faction_addclose.c b/posix/spawn_faction_addclose.c
index 3073c05761..5a0dc6c1cf 100644
--- a/posix/spawn_faction_addclose.c
+++ b/posix/spawn_faction_addclose.c
@@ -29,7 +29,7 @@ __posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *file_actions,
{
struct __spawn_action *rec;
- if (!__spawn_valid_fd (fd))
+ if (fd < 0)
return EBADF;
/* Allocate more memory if needed. */
diff --git a/posix/spawn_faction_addclosefrom.c b/posix/spawn_faction_addclosefrom.c
index 5c56d035c6..f55d69b2ea 100644
--- a/posix/spawn_faction_addclosefrom.c
+++ b/posix/spawn_faction_addclosefrom.c
@@ -28,7 +28,7 @@ __posix_spawn_file_actions_addclosefrom (posix_spawn_file_actions_t
#if __SPAWN_SUPPORT_CLOSEFROM
struct __spawn_action *rec;
- if (!__spawn_valid_fd (from))
+ if (from < 0)
return EBADF;
/* Allocate more memory if needed. */
diff --git a/posix/spawn_faction_adddup2.c b/posix/spawn_faction_adddup2.c
index f9564ef4c2..9190eb2a75 100644
--- a/posix/spawn_faction_adddup2.c
+++ b/posix/spawn_faction_adddup2.c
@@ -29,7 +29,7 @@ __posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions,
{
struct __spawn_action *rec;
- if (!__spawn_valid_fd (fd) || !__spawn_valid_fd (newfd))
+ if (fd < 0 || newfd < 0)
return EBADF;
/* Allocate more memory if needed. */
diff --git a/posix/spawn_faction_addfchdir.c b/posix/spawn_faction_addfchdir.c
index a3df6df489..e851af1722 100644
--- a/posix/spawn_faction_addfchdir.c
+++ b/posix/spawn_faction_addfchdir.c
@@ -28,6 +28,9 @@ posix_spawn_file_actions_addfchdir_np (posix_spawn_file_actions_t *actions,
{
struct __spawn_action *rec;
+ if (fd < 0)
+ return EBADF;
+
/* Allocate more memory if needed. */
if (actions->__used == actions->__allocated
&& __posix_spawn_file_actions_realloc (actions) != 0)
diff --git a/posix/spawn_faction_addopen.c b/posix/spawn_faction_addopen.c
index bb9fc41b99..bd610e79b0 100644
--- a/posix/spawn_faction_addopen.c
+++ b/posix/spawn_faction_addopen.c
@@ -31,7 +31,7 @@ __posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
{
struct __spawn_action *rec;
- if (!__spawn_valid_fd (fd))
+ if (fd < 0)
return EBADF;
char *path_copy = __strdup (path);
diff --git a/posix/spawn_faction_addtcsetpgrp_np.c b/posix/spawn_faction_addtcsetpgrp_np.c
index 291b115212..6f2f0d315e 100644
--- a/posix/spawn_faction_addtcsetpgrp_np.c
+++ b/posix/spawn_faction_addtcsetpgrp_np.c
@@ -27,7 +27,7 @@ __posix_spawn_file_actions_addtcsetpgrp_np (posix_spawn_file_actions_t
{
struct __spawn_action *rec;
- if (!__spawn_valid_fd (tcfd))
+ if (tcfd < 0)
return EBADF;
/* Allocate more memory if needed. */
diff --git a/posix/spawn_int.h b/posix/spawn_int.h
index 0291526edb..297a203c65 100644
--- a/posix/spawn_int.h
+++ b/posix/spawn_int.h
@@ -87,8 +87,4 @@ extern int __spawni (int *pid, const char *path,
const posix_spawnattr_t *attrp, char *const argv[],
char *const envp[], int xflags) attribute_hidden;
-/* Return true if FD falls into the range valid for file descriptors.
- The check in this form is mandated by POSIX. */
-bool __spawn_valid_fd (int fd) attribute_hidden;
-
#endif /* _SPAWN_INT_H */
diff --git a/posix/spawn_valid_fd.c b/posix/spawn_valid_fd.c
deleted file mode 100644
index 1d4cd99256..0000000000
--- a/posix/spawn_valid_fd.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* File descriptor validity check for posix_spawn file actions.
- Copyright (C) 2000-2026 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
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#include "spawn_int.h"
-
-#include <unistd.h>
-
-bool
-__spawn_valid_fd (int fd)
-{
- long maxfd = __sysconf (_SC_OPEN_MAX);
- return __glibc_likely (fd >= 0)
- && (__glibc_unlikely (maxfd < 0) /* No limit set. */
- || __glibc_likely (fd < maxfd));
-}
diff --git a/posix/tst-posix_spawn-fd.c b/posix/tst-posix_spawn-fd.c
index e75d829562..72a40ff9a3 100644
--- a/posix/tst-posix_spawn-fd.c
+++ b/posix/tst-posix_spawn-fd.c
@@ -72,7 +72,7 @@ all_tests (const char *name, int (*func) (int))
one_test (name, func, -1, false);
one_test (name, func, -2, false);
if (maxfd >= 0)
- one_test (name, func, maxfd, false);
+ one_test (name, func, maxfd, true);
}
static int
--
2.51.0
More information about the Libc-alpha
mailing list