[PATCH] posix: Handle negative fds in spawn's addfchdir
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Wed Mar 25 21:19:00 GMT 2026
On 25/03/26 16:15, Adhemerval Zanella Netto wrote:
>
>
> On 25/03/26 15:27, Collin Funk wrote:
>> Lucas Chollet <lucas.chollet@free.fr> writes:
>>
>>> Hello all,
>>> This is my first contribution here, so I hope I got everything right.
>>> I tested this patch on my Linux x86_64 machine with `make check` and
>>> got no regressions compared to master.
>>>
>>> 8<
>>>
>>> This patch makes `posix_spawn_file_actions_addfchdir` return EBADF on
>>> negative file descriptors. This is mandated by POSIX and similar to what
>>> is already done in addopen/addclose.
>>>
>>> Signed-off-by: Lucas Chollet <lucas.chollet@free.fr>
>>> ---
>>> posix/spawn_faction_addfchdir.c | 3 +++
>>> 1 file changed, 3 insertions(+)
>>>
>>> diff --git a/posix/spawn_faction_addfchdir.c b/posix/spawn_faction_addfchdir.c
>>> index a3df6df489..b51139a61f 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 (!__spawn_valid_fd (fd))
>>> + return EBADF;
>>> +
>>> /* Allocate more memory if needed. */
>>> if (actions->__used == actions->__allocated
>>> && __posix_spawn_file_actions_realloc (actions) != 0)
>>
>> Thank you for the patch!
>>
>> However, I want to note here that __spawn_valid_fd() checks if the file
>> descriptor is greater than getdtablesize(). Using it here, along with
>> some (all?) other places it is used, is incorrect. POSIX states [1]:
>>
>> [EBADF]
>> The value specified by fildes is negative.
>>
>> It shall not be considered an error for the path or fildes argument
>> passed to these functions to specify a pathname or file descriptor
>> for which the specified operation could not be performed at the time
>> of the call. Any such error shall be detected when the associated
>> file actions object is later used during a posix_spawn() or
>> posix_spawnp() operation.
>>
>> I noticed glibc's misbehavior when working on Gnulib last year, but
>> evidently forgot to fix it...
>
> Indeed it seems that POSIX 2018 [1] changed the error handling for possible
> invalid file descriptors. It seems that __spawn_valid_fd checks are not
> required anymore.
>
> [1] https://austingroupbugs.net/view.php?id=418
However, the POSIX requirements seems conflicting. It states that
[EBADF]
The value specified by fildes is negative or greater than or equal to {OPEN_MAX}.
But at the same time it states that values potentially greater than
OPEN_MAX are not necessary an error:
"It shall not be considered an error for the fildes argument passed to these
functions to specify a file descriptor for which the specified operation could
not be performed"
So I think the 'EBADF' is a 'shall fail' only for negative values,
which seems the interpretation of musl and *BSD. I think it makes more sense.
More information about the Libc-alpha
mailing list