|
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.