|
|
Message-ID: <e7dc11a5db39ecb427f02d9a6db3971d@ispras.ru>
Date: Mon, 02 May 2022 22:26:36 +0300
From: Alexey Izbyshev <izbyshev@...ras.ru>
To: musl@...ts.openwall.com
Subject: vfork()-based posix_spawn() has more failure modes than fork()-based
one
Hi,
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) {
perror("fork");
return 127;
}
if (pid == 0) {
execve(argv[1], argv + 1, envp);
_exit(127);
}
} else {
int err = posix_spawn(0, argv[1], 0, 0, argv + 1, envp);
if (err) {
printf("posix_spawn: %s\n", strerror(err));
return 127;
}
}
wait(NULL);
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
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.
Alexey
[1] https://github.com/python/cpython/issues/91307
[2] https://sourceware.org/bugzilla/show_bug.cgi?id=29115
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.