Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Mon, 02 May 2022 22:26:36 +0300
From: Alexey Izbyshev <>
Subject: vfork()-based posix_spawn() has more failure modes than fork()-based


I was recently made aware via [1] that vfork() can have more failure 
modes than fork() on Linux. The only case I know about is due to Linux 
not allowing processes in different time namespaces to share address 
space, but probably there are or will be more. An example is below 
(requires Linux >= 5.6).

$ cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <spawn.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char *argv[], char *envp[]) {
   if (getenv("TEST_FORK")) {
     pid_t pid = fork();
     if (pid < 0) {
         return 127;
     if (pid == 0) {
         execve(argv[1], argv + 1, envp);
   } else {
       int err = posix_spawn(0, argv[1], 0, 0, argv + 1, envp);
       if (err) {
         printf("posix_spawn: %s\n", strerror(err));
         return 127;
   return 0;

$ musl-gcc test.c
$ unshare -UrT ./a.out /bin/echo OK
posix_spawn: Invalid argument
$ TEST_FORK=1 unshare -UrT ./a.out /bin/echo OK

A common expectation from applications is that they can use 
posix_spawn() as a drop-in replacement for fork()/exec() (when its 
child-tweaking features are sufficient), but this case breaks the 
expectation. Do you think it would make sense for musl to fallback to 
fork() in case vfork() fails in posix_spawn()?

I've also opened a bug about this in glibc[2]. Maybe libcs could 
coordinate in how they handle this case.



Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.